ここ 2 年間、PHP を使ったプログラムを書いていなかったので、今日 PHP を使ってみたくなり、ネットで調べたら PHP5 について再び興味が湧いたので、この記事を翻訳してみました。
この記事は http://www.php.net/ からのものです。
新しいオブジェクト モデル
PHP のオブジェクト処理部分が完全に書き直され、パフォーマンスが向上し、機能が追加されました。以前のバージョンの PHP では、オブジェクトはプリミティブな単純型
(整数や文字列など) として扱われていましたが、このアプローチの欠点は、変数が割り当てられるかパラメーターとして渡されるときに、オブジェクトのコピーが取得されることです。新しいバージョンでは、
オブジェクトはオブジェクトの値ではなく、ハンドルを通じて参照されます (ハンドルはオブジェクトの識別子として認識されます)。
多くの PHP プログラマーは、古いオブジェクト モデルの「コピーの癖」に気づいていない可能性があるため、以前のほとんどの PHP プログラムは変更を加えずに
、または最小限の変更のみで実行できます。
プライベート メンバーと保護されたメンバー
PHP 5 では、ビジュアル クラス プロパティを定義できるプライベート メンバー変数と保護されたメンバー変数が導入されました。
例
保護されたメンバー変数はクラスのサブクラスでアクセスできますが、プライベート メンバー変数はそれが属するクラスでのみアクセスできます。
Hello; print "MyClass::printHello() " . $this->Bar; print "MyClass::printHello() " . $this->Foo; } }class MyClass2 extends MyClass { protected $Foo; function printHello() { MyClass::printHello(); /* print "MyClass2::printHello() " /* すべきではありません。 print out anything */ print "MyClass2::printHello() " . $this->Bar; /* print すべきではありません (宣言されていません)*/ print "MyClass2::printHello() " . ; /* 出力する必要があります */ }}$obj = new MyClass();print $obj->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() added.n"; $this->aProtectedMethod(); ;$o->aPublicMethod();?>
前のコードのユーザー定義クラスまたはメソッドは、「public」、「protected」、「private」などのキーワードを定義していませんが、変更せずに実行できます。
抽象クラスとメソッド
PHP 5 では、抽象クラスとメソッドも導入されています。抽象メソッドはメソッドの「シンボル」を宣言するだけで、実装は提供しません。抽象メソッドを含むクラスは「abstract」として宣言する必要があります。
例:
test();?>
抽象クラスはインスタンス化できません。
「abstract」キーワードは古いコードのユーザー定義クラスまたはメソッドで定義されていませんが、変更せずに実行できます。
インターフェース
ZEND Engine 2.0 にはインターフェースが導入されています。クラスはインターフェイスの任意のリストを実装できます。
例:
古いコードのユーザー定義クラスまたはメソッドであっても「interface」キーワードは定義されていませんが、変更しなくても正常に動作します。
クラス型ヒント
PHP 5 では、型を定義せずにクラスを保持しながら、オブジェクトのクラスをパラメーターを通じてメソッドに渡すために宣言するクラス型ヒントが導入されました。
例:
a($b);$a->b($b ) ;?>
これらのクラス型ヒントは、型定義を必要とする一部の言語のようにコンパイル時にはチェックされず、実行時にチェックされます。これは次のことを意味します:
は次と同等です:
この構文はオブジェクトまたはクラスにのみ使用され、組み込み型には使用されません。
最後のキーワード(最終)
PHP 5 では、サブクラスでオーバーライドできないメンバーまたはメソッドを定義するために「final」キーワードが導入されました。
例:
class Foo {final function bar() { // ... }}?>
以前に書いたユーザー定義クラスやメソッドには「final」キーワードが定義されていませんが、コードですが、変更せずに実行できます。
オブジェクトのクローン作成
PHP 4 オブジェクトがコピーされるとき、ユーザーはどのコピー コンストラクターを実行するかを決定できません。コピーするとき、PHP 4 はオブジェクトのプロパティ
に基づいて同じコピーを少しずつ作成します。
毎回正確なレプリカを構築することは、必ずしも私たちが望むものであるとは限りません。コピー構築の良い例は、ウィンドウのすべてのリソースを所有する GTK ウィンドウを表すオブジェクトがある場合です。コピーを作成するときに、元のウィンドウのすべてのプロパティを所有する新しいウィンドウが必要になる場合があります。ただし、新しいウィンドウのリソースを所有する必要があります。別の例としては、別のオブジェクトを参照する
オブジェクトがあり、親オブジェクトをコピーするときに、その参照先オブジェクトの新しいインスタンスを作成して、複製に別のコピーが存在するようにしたい場合があります。
オブジェクトのコピーは、オブジェクトの __clone() メソッドを呼び出すことで完了します:
$copy_of_object = $object->__clone();
?> 開発者が新しいオブジェクトの作成を要求したときを実行すると、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->名前 = "テルアビブ";
$obj = $obj->__clone();
print $obj->id . "n";
?>
均一な構築メソッド
ZEND エンジンを使用すると、開発者はクラスの構築メソッドを定義できます。コンストラクター メソッドを持つクラスが作成されると、コンストラクター メソッドが最初に呼び出されます。コンストラクター メソッドは、クラスが正式に使用される前の初期化に適しています。
PHP4では、コンストラクターの名前はクラス名と同じです。派生クラスで親クラスを呼び出すのが一般的であるため、大規模なクラス継承内でクラスを移動する場合、
PHP4 でクラスを処理するのは少し面倒です。派生クラスを別の親クラスに移動する場合、親クラスのコンストラクター名は異なる必要があります。この場合、派生クラスでの親クラスのコンストラクターの呼び出しに関するステートメントを書き直す必要があります。
PHP5 では、__construct() を呼び出すことでコンストラクターを定義する標準的な方法が導入されています。
例:
class BaseClass {
function __construct() {
print "In BaseClass constructionorn";
}
}
class SubClass extends BaseClass {
function __construct() {
parent::__construct() ;
print "In SubClass constructionorn";
}
}
$obj = new BaseClass();
PHP5 クラスが __construct () を見つけられない場合メソッドの場合、コンストラクター メソッドは、クラス名
である古いメソッドを通じて見つかります。これは、互換性の問題を引き起こす可能性がある唯一のことは、__construct() というメソッド名が以前のコードで使用されていた場合であることを意味します。
破壊メソッド
破壊メソッドを定義すると非常に便利です。デストラクター メソッドは、デバッグ情報を記録し、データベース接続を閉じ、その他のクリーンアップ作業
を実行できます。 PHP 4 にはそのようなメカニズムはありませんが、PHP はリクエストの最後に実行する必要がある関数の登録をすでにサポートしています。
PHP5 では、Java などの他のオブジェクト指向言語と同様のデストラクター メソッドが導入されています。オブジェクトへの最後の参照がクリアされると、システムはオブジェクトがメモリから解放される前に __destruct() というデストラクターを呼び出します。 。
例:
class MyDestructableClass {
function __construct() {
print "コンストラクター内";
$this->name = "MyDestructableClass";
}
function __destruct() {
print " " . $this->name . "n";
}
}
$obj = new MyDestructableClass();
?>
コンストラクター メソッドと同様に、エンジンは親のデストラクター メソッドを呼び出しません。このメソッドを呼び出すには、サブクラスのデストラクター メソッドのparent::__destruct() ステートメントを通じてこのメソッドを呼び出す必要があります。
定数
PHP 5 では、クラスごとの定数の定義が導入されています。
class Foo {
const constant = "constant"
}
echo "Foo::constant = " . Foo::constant . "n";
PHP5 では定数内の式はコンパイル時に評価されるため、その値を変更することはできません。急いで。
class Bar {
const a = 1<<0;
const c = a b
?> 「const」キーワードが定義されたクラスまたはメソッドで定義されていない場合は、変更せずに実行できます。
例外
PHP4 には例外処理がありません。PHP5 では、他の言語と同様の例外処理モデルが導入されています。
class MyExceptionFoo extends Exception {
function __construct($Exception) {
parent::__construct($Exception)
}
try {
throw new MyExceptionFoo("Hello")
} catch; (MyExceptionFoo $Exception) {
print $Exception->getMessage();
?>
'catch'、'throw'、'try' は、前のコードのキーワードですが、変更せずに実行できます
。
関数はオブジェクトの値を返す
PHP4 では、関数がオブジェクトの値を返し、返されたオブジェクトに対してメソッド呼び出しを行うことは不可能です。Zend Engine 2
(ZEND Engine 2) の登場により、次の呼び出しが行われるようになります。可能:
php
class Circle {
functiondraw() {
print "Circlen";
}
class Square {
print "Squaren"; function ShapeFactoryMethod($shape) {
switch ($shape) {
case "Circle":
return new Circle();
case "Square":
return new Square()
}
}
ShapeFactoryMethod("Circle" ")->draw ();
ShapeFactoryMethod("Square")->draw();
?>
静的クラスの静的メンバー変数を初期化できます
例:
class foo {
static $my_static = 5 ;
}
静的メソッド
print foo::$my_static;
PHP5 では、外部から呼び出すことができる静的メソッドを定義します。物体。
例:
class Foo {
public static function aStaticMethod() {
// ...
}
}
Foo::aStaticMethod()?> this 静的として定義されたメソッドでは無効です。
Instanceof
PHP5 では、オブジェクトが特定のオブジェクトのインスタンスであるか、特定のオブジェクトの派生であるか、または特定のインターフェイスを使用しているかを判断するために「instanceof」キーワードが導入されています。
例:
classbaseClass { }
$a = newbaseClass;
if ($ainstanceofbasicClass) {
echo "Hello World"
?>
静的関数変数
すべての静的変数がコンパイル時に処理されるようになり、開発者は参照によって静的変数を指定できるようになりました。この変更により効率は向上しますが、静的変数への間接参照は不可能になります。
関数内で参照によって渡されるパラメータにはデフォルト値を設定できます
例:
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];
print "Returning: $rn";
return $r; else {
print "Nothing!n";
}
関数 __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 ->a = 100;
$foo->z++;
; 例: __call() php
class Caller {
var $x = array(1, 2, 3);
function __call($m, $a) {
print "メソッド $m が呼び出されました:n"; return $this->x;
}
}
$foo = new Caller();
$a = $foo->test(1, "2", 3.4, true); ;
?>