はじめに 今日、ふと思い立って PHP 公式サイトに行ってみると、PHP5 のリリースのお知らせがチラッと目に入りました。以前に PHP5 のプレビューを見たことはありましたが、それでも PHP 5/Zend Engine 2.0 の新機能に関する記事を注意深く読んだところ、JAVA の息吹が私の顔に湧きました... この記事を特別に翻訳し、最初に公開しました。読者のための CSDN Web サイト。 PHP 5/Zend Engine 2.0 の新機能 Xu Huanchun による翻訳 sfwebsite@hotmail.com http://www.php.net/zend-engine-2.php 新しいオブジェクト モデル PHP のオブジェクト処理部分が完全に書き直されました。より優れたパフォーマンスとより多くの機能。以前のバージョンの PHP では、オブジェクトは組み込み変数タイプ (整数や文字列など) と同じように扱われていましたが、変数がオブジェクトに割り当てられたとき、またはオブジェクトがパラメーターとして渡されたときにコピーが取得されるという欠点がありました。オブジェクトの。新しいバージョンでは、オブジェクトは値ではなくハンドルによって参照されます。 (ハンドルはオブジェクトの識別子と考えることができます) 多くの PHP プログラマは、以前のオブジェクト モデルの「コピーの癖」に気づいていない可能性があるため、以前の PHP プログラムは変更を加える必要がないか、小さな変更を加えるだけです。実行可能なプライベート メンバーと保護されたメンバー PHP 5 では、クラス プロパティにいつアクセスできるかを定義するプライベート メンバー変数と保護されたメンバー変数が導入されました。 例: クラスの保護されたメンバー変数はこのクラスの拡張クラスでアクセスできますが、プライベート メンバー変数はこのクラスでのみアクセスできます。 Hello; print "MyClass::printHello() " . $this->Foo; クラス MyClass2 extends MyClass { protected $Foo; { MyClass::printHello(); /* 出力する必要があります */ print "MyClass2::printHello() " . $this->Hello; /* 何も出力しません */ print "MyClass2::printHello() " . ->Bar; /* 印刷すべきではありません (宣言されていません)*/ print "MyClass2::printHello() " . $this->Foo; /* 印刷すべきです */ } } $obj = new MyClass(); >Hello; /* 何も出力すべきではありません */ print $obj->Bar; /* 何も出力すべきではありません */ print $obj->Foo; /* 何も出力すべきではありません */ $obj->printHello(); * 出力する必要があります */ $obj = new MyClass2(); print $obj->Hello; /* 何も出力しません */ print $obj->Bar; /* 何も出力しません */ print $obj->Foo; /* 何も出力しません */ $obj->printHello(); ?> プライベート メソッドと保護されたメソッド PHP 5 (ZEND エンジン 2) では、プライベート メソッドと保護されたメソッドも導入されました。 例: aPrivateMethod(); } } class Bar extends Foo { public function aPublicMethod() { echo "Bar::aPublicMethod() が呼び出されます。 "; $this->aProtectedMethod(); } } $o = new Bar; $o->aPublicMethod(); ?> "public"、"protected"、または "protected" がユーザー定義クラスに定義されていない、または抽象クラスとメソッド PHP 5 では、抽象メソッドはメソッド定義のみを宣言し、抽象メソッドを含むクラスは抽象として宣言する必要があります。 .例: test(); ?> 抽象クラスはインスタンス化できません。前のコードでは「abstract」キーワードが定義されていませんが、インターフェイス ZEND エンジンを編集せずに実行できます。 2.0 では、インターフェイスが導入されました。クラスは任意のインターフェイス リストを実行できます。例: 前のコードでは "interface" キーワードが定義されていませんが、同時にクラス タイプ定義を定義する必要はありません。 , PHP 5 では、パラメーターを通じてメソッドに渡すクラスを宣言するクラス型定義が導入されました。 例: $a->b($b); これらのクラス型は、次のように定義されています。型の事前定義が必要な一部の言語では、チェックは実行時に行われます。これは次のことを意味します: 以下と同等: この構文は、組み込みの PHP 型ではなく、オブジェクトまたはクラスにのみ適用されます。5 では、定義する「final」キーワードが導入されています。サブクラスでオーバーライドできないメンバーまたはメソッド。例: 前のコードのユーザー定義クラスまたはメソッドで "final" キーワードが定義されていませんが、編集せずに実行できます。 オブジェクトのクローン作成 PHP 4 では、オブジェクトがコピーされるとき、ユーザーはコピーのメカニズムを決定できません。コピーする場合、PHP 4 は元のオブジェクトの正確なコピーを少しずつ作成します。 毎回正確なレプリカを構築する必要はありません。コピー メカニズムが必要になる良い例は、GTK ウィンドウを表すオブジェクトがあり、そのウィンドウのすべてのリソースを所有する場合です。コピーを作成するときに、元のウィンドウのすべてのプロパティを所有する新しいウィンドウが必要になる場合があります。新しいウィンドウのリソースを所有する必要があります。別の例としては、別のオブジェクトを参照するオブジェクトがあり、親オブジェクトをコピーするときに、その参照先オブジェクトの新しいインスタンスを作成して、コピーがそれを参照するようにしたい場合があります。 オブジェクトのコピーは、オブジェクトの __clone() メソッドを呼び出すことで完了します: __clone(); ?> 開発者がオブジェクトの新しいコピーの作成を要求すると、ZEND エンジンは __clone() メソッドが定義されているかどうかを確認します。未定義の場合、デフォルトの __clone() メソッドを呼び出して、オブジェクトのすべてのプロパティをコピーします。このメソッドが定義されている場合、コピーに必要なプロパティを設定する役割を果たします。便宜上、エンジンはソース オブジェクトからすべてのプロパティをインポートする関数を提供します。これにより、最初に値を含むソース オブジェクトのコピーを取得し、変更する必要があるプロパティを上書きするだけで済みます。 例: id = self::$id++; } function __clone() { $this->name = $that->name; $this->id = self::$; $obj = new MyCloneable(); $obj->address = "Tel-Aviv"; "; $obj = $obj->__clone(); print $obj->id . " "; $obj->name を出力します。" "; $obj->address を出力します。" "; ?> 統一されたコンストラクター名 ZEND エンジンにより、開発者はクラスのコンストラクターを定義できます。コンストラクターを持つクラスは、作成時に最初にコンストラクターを呼び出します。コンストラクターは、クラスが正式に使用される前の初期化に適しています。PHP4 ではPHP 4 では、コンストラクター メソッドの名前はクラス名と同じになります。派生クラスで親クラスを呼び出すことが一般的であるため、大規模なクラス継承でクラスが移動された場合の処理方法が少し異なります。クラスを別の親クラスに移動すると、親クラスのコンストラクター メソッド名が異なる必要があるため、親クラスのコンストラクター メソッドの呼び出しに関する派生クラスのステートメントを、PHP 5 で標準的な方法を導入して書き直す必要があります。例 下位互換性のために、PHP5 はクラス内で __construct() メソッドを見つけることができません。古いメソッドは、コンストラクターを見つけるためにクラス名を使用すると便利です。これは、デストラクター メソッドがデバッグ情報をログに記録できる場合にのみ、互換性の問題が発生する可能性があることを意味します。このメカニズムは PHP 4 では使用できませんが、PHP 5 では Java などの他のオブジェクト指向言語と同様のデストラクターの概念が導入されています。オブジェクトへの最後の参照が破棄されると、オブジェクト デストラクターは、パラメーターを受け取らないクラス メソッド名 %__destruct()% であり、オブジェクトがメモリから解放される前に呼び出されます。PHP5 では、Java などの他のオブジェクト指向言語と同様のデストラクター メソッドが導入されています。オブジェクトへの参照がクリアされると、システムはオブジェクトがメモリから解放される前に __destruct() という名前のデストラクター メソッドを呼び出します。 >名前。」 "; } } $obj = new MyDestructableClass(); ?> コンストラクター メソッドと同様に、エンジンは親クラスのデストラクター メソッドを呼び出しません。このメソッドを呼び出すには、デストラクター メソッドでparent::__destruct を渡す必要があります。定数 PHP 5 ではクラス定数定義が導入されています: PHP5 では定数内の式が許可されていますが、定数内の式はコンパイル時に評価されるため、定数の値は実行時に変更できません。