マジックメソッド

__construct, __destruct (コンストラクタとデストラクタ参照), __call, __get, __set (オーバーローディング参照), __sleep, __wakeup, および __toString は、PHPクラスにおける特殊関数の名前です。 これらの関数に関連する特別な機能を使用する場合を除き、 クラス内にこれらの名前を有する関数を作成してはいけません。

注意

PHP は、__ で始まる関数名を特殊関数として予約しています。 文書化された特殊な機能を必要とする場合を除き、 __ で始まる関数名を使用しないことが推奨されます。

__sleep__wakeup

serialize() は、クラスに 特殊な名前__sleepを有数関数があるかどうかを 調べます。もしある場合には、この関数がシリアル化の前に実行されます。 この関数によりオブジェクトのクリンナップを行うことができ、 シリアル化するオブジェクトの全ての変数の名前を有する配列を返す と仮定されます。

意図される __sleep の使用法は、 オブジェクトが有する可能性があるデータベース接続に関係しており、 ペンディングされたデータベースのコミットをオコナッ足り、 同様のクリンナップタスクを行ったりするものです。 また、この関数は、オブジェクトのサイズが非常に大きく、全体を 保存することができない場合にも便利です。

逆に、unserialize() は、 特殊な名前__wakeupを有する 関数の存在を調べます。 もし、存在する場合、この関数は、オブジェクトが有する可能性が あるあらゆるリソースを再構築することができます。

意図される__wakeupの使用法は、 シリアル化の際に失われたデータベース接続を再度確立したり、 その他の再初期化を行うことです。

__toString

__toStringメソッドにより、 クラスが文字列に変換される際の動作を決めることができます。

例 19-25. 簡単な例

<?php
// 簡単なクラスを宣言
class TestClass
{
    
public $foo;

    
public function __construct($foo) {
        
$this->foo = $foo;
    }

    
public function __toString() {
        return
$this->foo;
    }
}

$class = new TestClass('Hello');
echo
$class;
?>

上の例の出力は以下となります:

Hello

注意が必要なのは、__toString メソッドは、 echo() または print(). と直接結合された場合のみコールされるということです。

例 19-26. __toStringがコールされる場合

<?php
// __toStringがコールされる
echo $class;

// __toStringがコールされる (まだechoの通常のパラメータである)
echo 'text', $class;

// __toStringはコールされない (結合演算がまず行われている)
echo 'text' . $class;

// __toStringはコールされない (文字列にまずキャストされている)
echo (string) $class;

// __toStringはコールされない (文字列にまずキャストされている)
echo "text $class";
?>