PHP のマジックメソッド

WBOY
リリース: 2016-06-23 14:30:36
オリジナル
1054 人が閲覧しました

1. __construct() と __destruct()

インスタンスが作成/破棄されるときに呼び出され、0 個以上のパラメーターを渡すことができます。

  class A  {    function A()    {      echo "build A";    }    function __destruct()    {      echo "destroy A";    }  }  $obj = new A();  //unset($obj); 
ログイン後にコピー

Note: The destructorメソッドは、特定のオブジェクトへの他の参照がなくなるとすぐに、またはシャットダウンシーケンス中に任意の順序で呼び出されます。

コンストラクタに関しては、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 は配列として渡されます。実行結果:

Calling object method 'runTest' in object contextCalling static method 'runTest' in static context
ログイン後にコピー

また、関数のスコープが保護されプライベートであることにも注意してください:

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 existsname = abc
ログイン後にコピー

4. __toString()

このメソッドは、オブジェクトを直接出力する場合、この関数を呼び出し、文字列を返す必要があります。

すごいです

__isset()、__unset()、__sleep()、__wakeup()、__toString()、__invoke()、__set_state()、__clone() もありますが、詳細は説明しません。一つ。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート