__construct()、__destruct()、__call()、__callStatic()、__get()、__set()、__isset()、__unset()、__sleep()、__wakeup()、__toString()、__invoke()、__set_state () と __clone() は、PHP では「マジック メソッド」と呼ばれます。マジック機能を使用しない限り、独自のクラス メソッドに名前を付けるときにこれらのメソッド名を使用することはできません。
PHP は、__ (アンダースコア 2 つ) で始まるすべてのクラスメソッドをマジックメソッドとして予約します。したがって、上記のマジック メソッドを除き、クラス メソッドを定義する場合は、先頭に __ を付けないことをお勧めします。
__sleep() と __wakeup()
publicarray__sleep (void)
void__wakeup (void)
serialize() 関数は、クラスにマジック メソッド __sleep() があるかどうかを確認します。存在する場合、このメソッドが最初に呼び出され、次にシリアル化操作が実行されます。この関数を使用すると、オブジェクトをクリーンアップし、シリアル化する必要があるオブジェクト内のすべての変数の名前を含む配列を返すことができます。メソッドが何も返さない場合、NULL がシリアル化され、E_NOTICE レベルのエラーが生成されます。
注:
__sleep() は、親クラスのプライベート メンバーの名前を返すことはできません。そうすると、E_NOTICE レベルのエラーが発生します。代わりに Serializable インターフェイスを使用することもできます。
__sleep() メソッドは、コミットされていないデータや同様のクリーニング操作を送信するためによく使用されます。同時に、この機能は、大きなオブジェクトがいくつかあるものの、すべてを保存する必要がない場合に便利です。
対照的に、unserialize() は __wakeup() メソッドがあるかどうかを確認します。存在する場合、__wakeup メソッドが最初に呼び出され、オブジェクトに必要なリソースが事前に準備されます。
__wakeup() は、データベース接続の再確立やその他の初期化操作の実行など、逆シリアル化操作でよく使用されます。
例 #1 スリープとウェイクアップ
class Connection { protected $link; private $server,$username,$password,$db; public function __construct($server,$username,$password,$db) { $this->server = $server; $this->username = $username; $this->password = $password; $this -> db = $db; $this -> connect(); } private function connect(){ $this -> link = mysql_connect($this->server,$this->username,$this->password); mysql_select_db($this->db,$this->link); } public function __sleep(){ return array('server','username','password','db'); } public function __wakeup(){ $this->connect(); } }
__toString()
public string __toString ( void )
__toString() メソッドは、文字列として扱われる場合にクラスがどのように応答するかに使用されます。たとえば、 echo $obj; は何かを表示するはずです。このメソッドは文字列を返す必要があります。そうでない場合は、E_RECOVERABLE_ERROR レベルの致命的なエラーが発行されます。
__toString() メソッドで例外をスローすることはできません。例外をスローすると、致命的なエラーが発生します。
例 #2 簡単な例
class TestClass { public $foo; public function __construct($foo) { $this->foo = $foo; } public function __toString(){ return $this->foo; } } $class = new TestClass('Hello'); echo $class;
出力結果:
Hello
PHP 5.2.0 より前では、__toString() メソッドは echo または print で直接使用された場合にのみ有効であることに注意してください。 PHP 5.2.0 以降では、任意の文字列環境 (%s 修飾子を使用した printf() など) で使用できますが、非文字列環境 (%d 修飾子の使用など) では使用できません。 PHP 5.2.0 では、__toString() メソッドを定義していないオブジェクトを文字列に変換すると、E_RECOVERABLE_ERROR レベルのエラーが生成されます。
__invoke()
mixed__invoke ([ $... ] )
関数を呼び出してオブジェクトを呼び出そうとすると、__invoke() メソッドが自動的に呼び出されます。
注:
この機能は、PHP 5.3.0 以降でのみ利用可能です。
例 #3 __invoke() を使用します
class CallableClass { function __invoke($x){ var_dump($x); } } $obj = new CallableClass; $obj(5); var_dump(is_callable($obj));
出力結果:
int(5)
bool(true)
__set_state()
static object __set_state ( array $properties )
PHP 5.1.0 以降静的メソッドは、クラスをエクスポートするために var_export() が呼び出されるときに呼び出されます。
このメソッドの唯一のパラメーターは配列であり、これには array('property' => value, ...) の形式で配置されたクラス プロパティが含まれます。
例 #4 __set_state()> の使用 (PHP 5.1.0 より)
class A { public $var1; public $var2; public static function __set_state($an_array) { $obj = new A; $obj -> var1 = $an_array['var1']; $obj -> var2 = $an_array['var2']; return $obj; } } $a = new A; $a->var1 = 5; $a->var2 = 'foo'; eval('$b='.var_export($a,true).';'); var_dump($b);
出力結果:
object(A)#2 (2) { ["var1"]=> var2"]=> string(3) "foo" }