新しいオブジェクト モデル
PHP のオブジェクト処理部分が完全に書き直され、パフォーマンスが向上し、機能が追加されました。以前のバージョンの PHP では、オブジェクトはプリミティブな単純型
(整数や文字列など) として扱われていましたが、このアプローチの欠点は、変数が割り当てられるかパラメーターとして渡されるときに、オブジェクトのコピーが取得されることです。新しいバージョンでは、
オブジェクトはオブジェクトの値ではなく、ハンドルを通じて参照されます (ハンドルはオブジェクトの識別子として考えられます)。
多くの PHP プログラマーは、古いオブジェクト モデルの「コピーの癖」に気づいていない可能性があるため、以前の PHP プログラムのほとんどは変更を加えずに実行できます
か、最小限の変更のみで実行できます。
プライベート メンバーと保護されたメンバー
PHP 5 では、ビジュアル クラス プロパティを定義できるプライベート メンバー変数と保護されたメンバー変数が導入されました。
例
保護されたメンバー変数はこのクラスのサブクラスでアクセスできますが、プライベート メンバー変数は、それが属するクラスでのみアクセスできます。
private $Hello = "Hello, World!n";
protected $Bar = "Hello, Foo!n";
protected $Foo = "Hello, Bar !n";
function printHello() {
print "MyClass::printHello() " . $this->gt;Hello;
print "MyClass::printHello() " . $this->gt; Bar;
print "MyClass::printHello() " . $this->Foo;
}
}
class MyClass2 extends MyClass {
protected $Foo>function printHello; () {
MyClass::printHello(); /* 出力する必要があります */
print "MyClass2::printHello() " . $this->Hello; /* 何も出力しません */
print "MyClass2::printHello() " . $this->Bar; /* 印刷すべきではありません (宣言されていません)*/
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 Engine 2) では、プライベート メソッドとプロテクト メソッドも導入されました。
例:
private function aPrivateMethod() {
echo "Foo::aPrivateMethod() added.n";
protected function aProtectedMethod( ) {
echo "Foo::aProtectedMethod() called.n";
$this->aPrivateMethod();
}
}
class Bar extends Foo {
public function aPublicMethod() {
echo "Bar::aPublicMethod() called.n";
$this->aProtectedMethod();
$o = 新しい Bar;
$o->aPublicMethod();
?>
前のコードのユーザー定義クラスまたはメソッドでは、「public」、「protected」、「private」などのキーワードが定義されていませんでした。 , ただし、変更しなくても動作します。
抽象クラスとメソッド
PHP 5 では、抽象クラスとメソッドも導入されています。抽象メソッドはメソッドの「シンボル」を宣言するだけで、実装は提供しません。抽象メソッドを含むクラスは「abstract」として宣言する必要があります。
例:
phpabstract class AbstractClass {
abstract public function test();
}
class ImplementedClass extends AbstractClass {
public function test() {
echo "ImplementedClass::test() が呼び出されました。n";
}
}
$o = new ImplementedClass;$o->test();
> 抽象クラスはインスタンス化できません。
古いコードのユーザー定義クラスやメソッドに「abstract」キーワードが定義されていませんが、変更せずに実行できます。
インターフェース
ZEND Engine 2.0 ではインターフェースが導入されています。クラスはインターフェイスの任意のリストを実装できます。
例:
古いコードのユーザー「interface」キーワードが定義されたクラスまたはメソッドで定義されていない場合は、変更せずに通常どおり実行できます。
クラス型ヒント (クラス型ヒント)
クラスが型を定義する必要性は維持しながら、PHP 5 では、パラメーターを介してオブジェクトのクラスをメソッドに渡すために宣言するクラス型ヒントが導入されています。
例:
a($b);$a->gt; b ($b);?>
これらのクラス型ヒントは、型定義を必要とする一部の言語のようにコンパイル時にはチェックされず、実行時にチェックされます。これは次のことを意味します:
は次と同等です:
この構文は、組み込みの )type ではなく、オブジェクトまたはクラスにのみ使用されます。
final キーワード (final)
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->アドレス = "テルアビブ";
print $obj->id = $ obj->__clone();
print $obj->id . "n";
print $obj-> address . "n";
?>
統一構築メソッド
ZEND エンジンを使用すると、クラスの構築メソッドを定義できます。コンストラクター メソッドを持つクラスが作成されると、コンストラクター メソッドが最初に呼び出されます。コンストラクター
メソッドは、クラスが正式に使用される前の初期化に適しています。
PHP4 では、コンストラクターの名前はクラス名と同じです。派生クラスで親クラスを呼び出すのが一般的であるため、
PHP4 での方法は、クラスが大規模なクラス継承内で移動される場合に少し扱いにくくなります。派生クラスを別の
を持つ親クラスに移動する場合、親クラスのコンストラクター名は異なる必要があります。この場合、派生クラスでの親クラスのコンストラクターの呼び出しに関するステートメントを書き直す必要があります。
PHP5 では、__construct() を呼び出すことでコンストラクターを定義する標準的な方法が導入されています。
例:
class BaseClass {
function __construct() {
print "In BaseClassconstructorn"
}
}
class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "サブクラス コンストラクター内";
$obj = new BaseClass();
$obj = new SubClass();
下位互換性のために、PHP5 クラスが __construct() メソッドを見つけられない場合は、古いメソッドが使用されます。つまり、クラス名
はコンストラクターを見つけるために使用されます。これは、__construct() というメソッド名が前のコードで使用されている場合にのみ、互換性の問題が発生する可能性があることを意味します。
破壊メソッド
破壊メソッドを定義すると非常に便利です。デストラクター メソッドは、デバッグ情報を記録し、データベース接続を閉じ、その他のクリーンアップ作業を実行できます。 PHP 4 にはそのようなメカニズムはありませんが、PHP はリクエストの最後に実行する必要がある関数の登録をすでにサポートしています。
PHP5 では、Java などの他のオブジェクト指向言語と同様のデストラクター メソッドが導入されています。オブジェクトへの最後の参照がクリアされると、
システムはオブジェクトがメモリから解放される前に __destruct と呼ばれるメソッドを呼び出します。 () デストラクターメソッド。
例:
class MyDestructableClass {
function __construct() {
print "Inconstructorn";
$this->name = "MyDestructableClass"; 🎜>}
function __destruct() {
print " . $this->name . "n"
}
}
$obj = new MyDestructableClass();
?>
このメソッドを呼び出すには、エンジンは親クラスのデストラクター メソッドを呼び出す必要はありません。 child
クラスparent::__destruct() ステートメントを通じて呼び出されます。
定数
PHP 5 では、クラスごとの定数の定義が導入されています。
class Foo {
const constant = "constant"
} <🎜; >
echo "Foo::constant = " . Foo::constant . "n";
?>
PHP では定数での式が評価されます。
したがって、定数はその場で値を変更できません。
クラス Bar {
const a = 1<<0;
const c = a
}
?>
前のコードのユーザー定義クラスまたはメソッドに「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.エンジン 2) では、次の呼び出しが可能です:
class Circle {
functiondraw() {
print "Circlen"
}
}
class Square {
functiondraw() {
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 では、オブジェクトの外部から呼び出すことができる静的メソッドを定義するためにキーワード 'static' が導入されました。
例:
class Foo {
public static function aStaticMethod() {
// ...
}
}
Foo::aStaticMethod();
?>
仮想変数 $this は、静的として定義されたメソッドでは無効です。
Instanceof
PHP5 では、オブジェクトがオブジェクトのインスタンスであるか、オブジェクトの派生であるか、またはインターフェイスを使用しているかを判断するために「instanceof」キーワードが導入されました。
例:
classbaseClass { }
$a = new baseClass;
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 "戻り値: $rn"; $r;
} else {
print "Nothing!n";
}
}
function __set($nm, $val) {
print "設定$nm] to $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 ;
$foo->z ( $foo);
?>
例: __call()
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);
var_dump($a)
?>