1. __construct() と __destruct()
は、インスタンスの作成/破棄時に呼び出され、両方とも 0 個以上のパラメーターを渡すことができます。
class A { function A() { echo "build A"; } function __destruct() { echo "destroy A"; } } $obj = new A(); //unset($obj);
注: デストラクター メソッドは、特定のオブジェクトへの参照が他になくなるとすぐに、またはシャットダウン シーケンス中に任意の順序で呼び出されます。
コンストラクターに関しては、PHP5.3.3 以降、定義 特定の名前空間内のクラス内のクラス名で名前が付けられたメソッドは、コンストラクターとはみなされなくなります。名前空間のないクラスでは、以前と同様にコンストラクターです。例:
namespace Foo; class Bar { public function Bar() { // treated as constructor in PHP 5.3.0-5.3.2 // treated as regular method as of PHP 5.3.3 } }
名前空間 Foo がない場合は、Bar() もコンストラクターとして使用されます。さらに、次の状況が存在する場合:
function __construct() { echo "construct A"; } function A() { echo "build A"; } function __destruct() { echo "destroy A"; } }
に __construct() とクラス名と同じ名前の関数の両方が含まれている場合、 __construct() のみが呼び出されます。
2. __call() と __callStatic()
存在しないメソッドを呼び出そうとしたときに呼び出されます。 2 つのパラメーター。1 つはメソッド名、もう 1 つは呼び出されたメソッドのパラメーター配列です。
class MethodTest { public function __call($name, $arguments) { // Note: value of $name is case sensitive. echo "Calling object method '$name' " . implode(' ', $arguments). "<br>"; } public static function __callStatic($name, $arguments) { // Note: value of $name is case sensitive. echo "Calling static method '$name' " . implode(' ', $arguments). "<br>"; } } $obj = new MethodTest; $obj->runTest('in','object','context'); MethodTest::runTest('in','static','context');
このうち、$arguments は配列として渡されます。実行結果:
オブジェクト コンテキストでオブジェクト メソッド 'runTest' を呼び出す
静的コンテキストで静的メソッド 'runTest' を呼び出す
また、関数のスコープが保護されプライベートであることにも注意してください:
class TestMagicCallMethod { public function foo() { echo __METHOD__.PHP_EOL."<br>"; } public function __call($method, $args) { echo __METHOD__.PHP_EOL."<br>"; if(method_exists($this, $method)) { $this->$method(); } } protected function bar() { echo __METHOD__.PHP_EOL."<br>"; } private function baz() { echo __METHOD__.PHP_EOL."<br>"; } } $test = new TestMagicCallMethod(); $test->foo(); /** * Outputs: * TestMagicCallMethod::foo */ $test->bar(); /** * Outputs: * TestMagicCallMethod::__call * TestMagicCallMethod::bar */ $test->baz(); /** * Outputs: * TestMagicCallMethod::__call * TestMagicCallMethod::baz */
3.__get( ) と __set()
存在しないオブジェクトのプロパティを読み取ろうとしたときに呼び出されます。
注: この関数を使用して、Java のリフレクションと同様のさまざまな操作を実装できます。
class Test { public function __get($key) { echo $key . " not exists"; } public function __set($key,$value) { echo $key . " = ".$value; } } $t = new Test(); echo $t->name."<br>"; $t->name = "abc";
出力:
name not unavailable
name = abc
4. __toString()
このメソッドは、オブジェクトを直接出力する場合、この関数を呼び出します。文字列を返す必要があります。
class Test { private $name = "abc"; private $age = 12; public function __toString() { return "name : $this->name, age : $this->age"; } } $t = new Test(); echo $t;
出力:
名前: abc、年齢: 12
PHP クラスの Magic Method のより簡潔な概要と関連記事については、PHP 中国語 Web サイトに注目してください。