特集
2004/05/25 20:30 更新

UNIX USER 2004年6月号「実践! 最新PHP 5」より転載:
Part 2 Zend Engine 2 (1/3)

「実践! 最新PHP 5」のPart 2では、PHP 5のコアであるZend Engine 2の導入で拡張・修正された機能について解説する。サンプルスクリプトを参照しながら、PHP 5ならではのオブジェクト指向プログラミングを理解していただきたい。

UNIX USER「実践! 最新PHP 5」のPart 2では、PHP 5のコアであるZend Engine 2の導入で拡張・修正された機能について解説する。サンプルスクリプトを参照しながら、PHP 5ならではのオブジェクト指向プログラミングを理解していただきたい。

INDEX Part 2:Zend Engine 2
1. 内部動作などの仕様変更
2. 拡張された機能

内部動作などの仕様変更

 PHP 5では、PHP 4で作ったスクリプトの大半が何も修正せずに動作する。そのため、PHP 4と比較して何が変更されたのか、まったく気付かないユーザーもいるだろう。ここでは、PHP 5で変更のあった仕様を解説しよう。

 なお、特集に使用したサンプルスクリプトを、

http://www.unixuser.jp/info/

に置いたので適宜利用してほしい。本特集でのサンプルスクリプトは、PHP5 RC1およびRC2で動作確認を行っている。読者の環境で確認する際には、実行例1のようにコンパイルオプションとphp.iniファイルを設定する必要があるだろう。また、PHPはApacheとの連携して動作するので、Apacheの設定ファイルのほうも修正を要する。Apacheの設定方法は使用するディストリビューションによって異なるので、オンラインマニュアルなどを参照して対応してほしい。なお、PHPのインストールに関する、詳しい情報は、READMEやINSTALLファイルにも記述がある。

実行例1 PHP5RC2のビルドとphp.iniの設定
$ cd /usr/local/src/
$ tar xvfz /tmp/php-5.0.0RC2.tar.bz2
$ cd php-5.0.0RC2
$ ./configure --with-apxs --enable-mbstring --enable-soap
$ make ↑マルチバイトとSOAPのライブラリを有効に
$ su
# make install
# cp /etc/apache/php.ini-recommended /usr/local/lib/
# echo "mbstring.internal_encoding = EUC-JP" >> /usr/local/lib/php.ini
↑内部エンコーディングを「EUC-JP」に設定

参照渡しとクローン

 PHP 4では、オブジェクトの代入動作がクローン(複製)※であった。オブジェクトの取り扱いで複製を必要とするケースは少なく、渡されたオブジェクトに対する操作がほとんどである。そのため、PHP 5では代入の動作がクローンから参照渡し※に変更された。

 どのような動作をするのかは、リスト1のサンプルスクリプトを実行すれば一目瞭然であろう(図1)。

リスト1 参照渡しによるオブジェクトの代入
1 <?PHP
2 class Foo
3 {
4 var $name;
5 }
6
7 $obj1 =& new Foo();
8 $obj1->name = "foo";
9
10 // $obj2に$obj1を代入(参照渡し)
11 $obj2 = $obj1;
12
13 // $obj3に$obj1のクローンを代入
14 $obj3 = clone $obj1;
15
16 // $obj1のメンバー変数を変更
17 // 参照渡しなら、つられて値が変わるはずだが……
18 $obj1->name ="bar";
19
20 var_dump($obj1, $obj2, $obj3);
21 ?>

zu2-1.png

図1 参照渡しによるオブジェクトの代入

 8行目で$obj1->nameが変更されると、$obj2->nameも変わったことになってしまう。これは、$obj2は$obj1の参照渡しであることを意味している。

 しかし、オブジェクトの代入が参照渡しだけになってしまうと困ることがある。それは、意図的にオブジェクトのコピーを作りたいときである。PHP 5では、そういったケースにも対応しているので安心してほしい。サンプルスクリプトの14行目のように、「clone」と記述するだけで、オブジェクトのクローンが左辺に代入される。

 なお、変数については従来どおりの動作※となるので、慣れるまではオブジェクトの動作と混同しないように気を付けてほしい。

コンストラクタ/デストラクタ

 PHP 4でサブクラスを作る際、ほかの言語に比べると納得できなかったであろう仕様が改善された。

 PHP 4では、コンストラクタはクラス名を、デストラクタはクラス名の前にアンダースコア(「_」)を足したものであった。さらに、デストラクタの実現にはPEAR※の継承は必須であった。この仕様には、スーパークラスの名前が変更された場合に、サブクラスのコンストラクタやデストラクタのコードまで修正する必要が出てきてしまうという欠陥が存在した。

 PHP 5では、リスト2のような従来どおりの宣言に加え、コンストラクタには「__construct」、デストラクタには「__destruct」を使用できるようになった(リスト3)。これによって、スーパークラスの名前にまったく依存しないプログラミングが可能になった(結果はどちらもリスト4)。

リスト2 従来型の宣言
1 <?PHP
2 require_once("PEAR.php");
3
4 // スーパークラス
5 // デストラクタを実現するために、PEARを
6 // 継承している
7 class Foo extends PEAR
8 {
9 function Foo() {
10 parent::PEAR();
11 echo "Foo's constructor
";
12 }
13
14 function _Foo() {
15 echo "Foo's destructor
";
16 }
17 }
18
19 // Fooのサブクラス
20 class Bar extends Foo
21 {
22 function Bar() {
23 parent::Foo();
24 echo "Bar's constructor
";
25 }
26
27 function _Bar() {
28 echo "Bar's destructor
";
29 parent::_Foo();
30 }
31 }
32
33 $obj = new Bar();
34 ?>

リスト3 PHP5で追加されたコンストラクタ/デストラクタ宣言の使用
1 <?PHP
2 class Foo
3 {
4 // コンストラクタ
5 function __construct() {
6 echo "Foo's constructor
";
7 }
8
9 // デストラクタ
10 function __destruct() {
11 echo "Foo's destructor
";
12 }
13 }
14
15 class Bar extends Foo
16 {
17 // コンストラクタ
18 function __construct() {
19 parent::__construct();
20 echo "Bar's constructor
";
21 }
22
23 // デストラクタ
24 function __destruct() {
25 echo "Bar's destructor
";
26 parent::__destruct();
27 }
28 }
29
30 // Barクラスのインスタンスを作る
31 $obj = new Bar();
32
33 ?>

リスト4 PHP5で追加されたコンストラクタ/デストラクタ宣言の使用(出力結果)
Foo's constructor
Bar's constructor
Bar's destructor
Foo's destructor

このページで出てきた専門用語
クローン
代入を行うとき、右辺の演算結果が左辺に代入される。このとき、右辺の演算結果の「値」を左辺に複製している。この複製処理が「クローニング」と呼ばれ、複製された値は「クローン」と呼ばれる。

参照渡し
値の複製ではなく、任意の変数・オブジェクトを指す方法。関数の引数に参照渡しを用いると、引数として渡された変数を直接操作することができる。

変数については従来どおりの動作
オブジェクトの代入がクローン処理であった場合、新しくインスタンスを生成してしまうので同一性を保証できない。しかし、変数の場合は型と値が正しければ同一性を保てるため、従来どおりに参照渡しは行われない。

PEAR
PHPに標準でバンドルされているライブラリ集。DBの接続やネットワーク処理など、さまざまな機能を簡単に利用できる。

      | 1 2 3 | 次のページ

[照井進吾,UNIX USER]

Copyright(C) 2010 SOFTBANK Creative Inc. All Right Reserved.