まえがき
今日、ふと思い立って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 では、クラス プロパティにいつアクセスできるかを定義するプライベート メンバー変数と保護されたメンバー変数が導入されました。
例
クラスの保護されたメンバー変数はこのクラスの拡張クラスでアクセスできますが、プライベート メンバー変数はこのクラスでのみアクセスできます。
class MyClass {
private $Hello = "Hello, World!n";
protected $Bar = "Hello, Foo!n";
protected $Foo = "Hello, Bar!n";
function printHello() {
printHello() 「 this->Foo; }
}
class MyClass2 extends MyClass {
/* 出力する必要があります */
:: printHello() " . $this->Hello; /* 何も出力しないでください */
printHello () :: 宣言)*/
print "MyClass2::print 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) では、プライベート メソッドと保護されたメソッドも導入されました。
例:
class Foo {
private function aPrivateMethod() { Foo::aProtectedMethod () が呼び出されました。 n";
$this->aPrivateMethod();
}
}
クラスバーextends Foo {
public function aPublicMethod() {
echo "Bar::aPublicMethod() added.n";
$this->aProtectedMethod();
}
}
$o = new Bar;
$o- >aPublicMethod();
?>
前のコードのユーザー定義のクラスまたはメソッドは、「public」、「protected」、「private」などのキーワードが定義されていませんが、編集せずに実行できます。
抽象クラスとメソッド
PHP 5 では、抽象クラスとメソッドも導入されました。抽象メソッドはメソッド定義を宣言するだけで、実際の実行は提供しません。抽象メソッドを含むクラスは、抽象クラスとして宣言する必要があります。
例:
abstract class AbstractClass {
abstract public function test();
}
class ImplementedClass extends AbstractClass {
public function test() {
echo "ImplementedClass::test() added.n" ;
}
}
$o = new ImplementedClass;
$o->test();
?>
抽象クラスはインスタンス化できません。前のコードのユーザー定義クラスまたはメソッドで「abstract」キーワードが定義されていませんが、編集せずに実行できます。
インターフェース
ZEND Engine 2.0 にはインターフェースが導入されています。クラスはインターフェイスの任意のリストを実行できます。
例
例:
interface Throwable {
public function getMessage();
}
class Exception 実装 Throwable {
public function getMessage() {
// ...
}
?> 「interface」キーワードは、前のコードのユーザー定義クラスまたはメソッドで定義されていませんが、編集せずに実行できます。
クラス型定義
型を定義せずにクラスを保持しながら、PHP 5 では、パラメーターを通じてメソッドに渡すクラスを宣言するためのクラス型定義が導入されました。
例
例:
interface Foo {
function a(Foo $foo);
}
interface Bar {
function b(Bar $bar);
}
class FooBarimplements Foo, Bar {
関数 a(Foo $foo) {
// ...
}
関数 b(Bar $bar) {
FooBar;
$a->a($b);
$a->b ($b);
?>
これらのクラスの型定義は、型の事前定義を必要とする一部の言語のようにコンパイル中には実行されず、代わりに実行時にチェックが行われます。これは次のことを意味します:
function foo(ClassName $object) (! ($ Object Instanceof ClassName)) {
DIE ("引数1 className") のインスタンスである必要があります。
final
PHP 5 では、サブクラスでオーバーライドできないメンバーやメソッドを定義するために「final」キーワードが導入されました。 eexample:
<?php
classfoo {
"キーワードですが、編集せずに機能します。
オブジェクトの複製
PHP 4 オブジェクトがコピーされるとき、ユーザーはコピーのメカニズムを決定できません。コピーする場合、PHP 4 は元のオブジェクトの正確なコピーを少しずつ作成します。
毎回正確なレプリカを構築する必要はありません。コピー メカニズムが必要になる良い例は、GTK ウィンドウを表すオブジェクトがあり、そのウィンドウのすべてのリソースを所有する場合です。コピーを作成するときに、元のウィンドウのすべてのプロパティを所有する新しいウィンドウが必要になる場合があります。新しいウィンドウのリソースを所有する必要があります。別の例としては、別のオブジェクトを参照するオブジェクトがあり、親オブジェクトをコピーするときに、その参照先オブジェクトの新しいインスタンスを作成して、コピーがそれを参照するようにしたい場合があります。
オブジェクトのコピーは、オブジェクトの __clone() メソッドを呼び出すことで完了します。
$copy_of_object = $object->__clone();
?>
開発者が新しいオブジェクトの作成を要求したときobject コピー時に、ZEND エンジンは __clone() メソッドが定義されているかどうかを確認します。未定義の場合、デフォルトの __clone() メソッドを呼び出して、オブジェクトのすべてのプロパティをコピーします。このメソッドが定義されている場合、コピーに必要なプロパティを設定する役割を果たします。便宜上、エンジンはソース オブジェクトからすべてのプロパティをインポートする関数を提供します。これにより、最初に値を含むソース オブジェクトのコピーを取得し、変更する必要があるプロパティを上書きするだけで済みます。
例:
class MyCloneable {
static $id = 0;
function MyCloneable() {
$this->id = self::$id++;
}
function __clone() {
$this->name = $that->name;
$this->address = "ニューヨーク";
$this->id = self::$id++;
}
}
$obj = new MyCloneable();
$obj->name = "こんにちは";
$obj->address = "電話番号-Aviv";
print $obj->id . "n";
$obj = $obj->__clone();
print $obj->id . "n";
print $obj ->name . "n";
print $obj->address . "n";
?>
統一されたコンストラクター メソッド名
ZEND エンジンを使用すると、開発者はクラスのコンストラクター メソッドを定義できます。コンストラクター メソッドを持つクラスが作成されると、コンストラクター メソッドが最初に呼び出されます。コンストラクター メソッドは、クラスが正式に使用される前の初期化に適しています。
PHP4では、コンストラクターの名前はクラス名と同じです。派生クラスで親クラスを呼び出すのが一般的であるため、大規模なクラス継承内でクラスを移動する場合、PHP4 は少し扱いにくくなります。派生クラスを別の親クラスに移動する場合、親クラスのコンストラクター名は異なる必要があります。この場合、派生クラスでの親クラスのコンストラクターの呼び出しに関するステートメントを書き直す必要があります。
PHP 5 では、コンストラクター メソッドを __construct() という名前で呼び出す標準的な方法が導入されています。
PHP 5 では、__construct() という名前でコンストラクター メソッドを宣言する標準的な方法が導入されています。
例
class BaseClass {
function __construct() {
print "In BaseClass constructionorn";
}
}
class SubClass extends BaseClass {
function __construct() {
parent::__construct( );
print "In SubClass constructionorn";
}
}
$obj = new BaseClass();
$obj = new SubClass();
?>
下位互換性のために、PHP5 は __construct( in the class ) メソッドを見つけることができません。の場合、コンストラクター メソッドは、クラス名である古いメソッドを通じて検索されます。これは、互換性の問題が発生する可能性があるのは、__construct() というメソッド名が前のコードで使用されている場合のみであることを意味します。
破壊メソッド
破壊メソッドを定義すると非常に便利です。デストラクター メソッドは、デバッグ情報を記録し、データベース接続を閉じ、その他の仕上げ作業を行うことができます。 PHP 4 にはそのようなメカニズムはありませんが、PHP はリクエストの最後に実行する必要がある関数の登録をすでにサポートしています。
PHP 5 では、Java などの他のオブジェクト指向言語と同様のデストラクターの概念が導入されています。オブジェクトへの最後の参照が破棄されると、パラメーターを受け取らないクラス メソッド名 %__destruct()% であるオブジェクトのデストラクターが、
PHP5 では、Java などの他のオブジェクト指向言語と同様のデストラクター メソッドが導入されています。オブジェクトへの最後の参照がクリアされると、システムはオブジェクトがメモリから解放される前にオブジェクトをメモリから解放します。 __destruct() という名前のデストラクター メソッドを呼び出します。 example:<?php
classmydestructableclass {
function __construct( "" "n"; ?>
コンストラクター メソッドと同様に、エンジンは親クラスのデストラクター メソッドを呼び出しません。このメソッドについては、デストラクター メソッドのparent::__destruct() ステートメントを介して呼び出す必要があります。サブクラスの。
定数
PHP 5 では、クラス定数の定義が導入されています:
class Foo {
const constant = "constant";
}
echo "Foo::constant = " "n" 。 ;
?>
PHP5 では定数内の式が許可されていますが、定数内の式はコンパイル時に評価されるため、実行時に定数の値を変更することはできません。
class Bar {
const a = 1<<0;
const b = 1<<1;
const c = a | b;
}
?> 「const」キーワードが定義されたクラスまたはメソッドで定義されていない場合は、編集せずに実行できます。
例外
PHP 4 には例外処理がありませんでした。PHP 5 では、他のプログラミング言語と同様の例外モデルが導入されました。
例:
class MyExceptionFoo extends Exception {
function __construct($Exception) {
Parent::__construct($Exception);throw new MyExceptionFoo("Hello");
} catch (MyException $Exception) {
print $Exception->getMessage();
}
?> のユーザー定義クラスやメソッドには定義されていませんが、前のコードの「catch」、「throw」、「try」キーワードは含まれていますが、編集せずに実行できます。
関数はオブジェクトの値を返します
PHP 4 では、関数によって返されたオブジェクトを逆参照したり、それらのオブジェクトに対してさらにメソッド呼び出しを行うことはできませんでしたが、Zend Engine 2 の登場により、次のことが可能になりました:
PHP4 では、関数はそうではありません。 t オブジェクトの値を返し、返されたオブジェクトに対してメソッド呼び出しを行うことが可能です。
}
Class Square {
Function Draw () {
Print "Squaren"; t Return New Circle () : > ;
静的クラスの静的メンバー変数を初期化できるようになりました
Example
class foo {
static $my_static = 5;
}
print foo::$my_static;
?>
静的メソッド
PHP5 オブジェクトの外部から呼び出せるように静的メソッドを定義するためにキーワード「static」が導入されました。
例:
class Foo {
public static function aStaticMethod() {
// ...
}
}
Foo::aStaticMethod();
?>
static の仮想変数 $thisメソッドでは無効です。
instanceof
PHP5 では、オブジェクトが特定のオブジェクトのインスタンスであるか、特定のオブジェクトの派生であるか、または特定のインターフェイスを使用しているかを判断するために、キーワード instanceof が導入されました。
例:
classbaseClass { }
$a = newbaseClass;
if ($ainstanceofbasicClass) {
echo "Hello World";
}
?>
静的関数変数
all静的変数はコンパイル時に処理されるようになり、開発者は参照によって静的変数を指定できるようになりました。この変更により効率は向上しますが、静的変数への間接参照は不可能になります。
関数内のパラメータは、アドレスで渡すことでデフォルト値を定義できます。
例:
function my_function(&$var = null) {
if ($var === null) {
die("$var には値が必要です");
}
}
?>
__autoload()
未定義のクラスを初期化するとき、エンジンは自動的に __autoload() インターセプター関数を呼び出します。クラス名は、__autoload() インターセプター関数への唯一のパラメーターとして渡されます。
例:
function __autoload($className) {
Include_once $className . ".php";
}
$object = new ClassName;
?>
メソッド呼び出しと属性呼び出しのオーバーロード
一般__call()、__get()、および __set() メソッドは、メソッド呼び出しと属性呼び出しのためにオーバーロードできます。
例: __get() と __set()
class Setter {
Public $n;
public $x = array("a" => 1, "b" => 2, " c " => 3);
function __get($nm) {
print "[$nm]n を取得中";
if (isset($this->x[$nm])) {
$r = $this->x[$nm];
Function __set($nm, $val) {
print "[$nm] を $valn に設定します";
if (isset($this->x[$nm])) {
$this->x[$nm] = $val;
print "OK!n";
} else {
print "Not OK! n";
}
}
}
$foo = new Setter();
$foo->n = 1;
$foo->a = 100;
$foo->a++;
$foo ->z++;
var_dump($foo);
?>
例: __call()
class Caller {
var $x = array(1, 2, 3);
function __call($m, $a) {
print "メソッド $m が呼び出しました:n ";
var_dump($a);
return $this->x;
}
}
$foo = new Caller();
$a = $foo->test(1, "2", 3.4 、 true);
var_dump($a);
?>