Web aym.pekori.to

マジックメソッド

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

注意

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

__sleep__wakeup

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

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

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

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

例 19-26. Sleep および wakeup

<?php
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()
    {
        
mysql_close($this->link);
    }
    
    
public function __wakeup()
    {
        
$this->connect();
    }
}
?>

__toString

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

例 19-27. 簡単な例

<?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-28. __toStringがコールされる場合

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

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

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

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

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

__set_state

この static メソッドは、 PHP 5.1.0 以降で var_export() によって エクスポートされたクラスのためにコールされます。

このメソッドの唯一のパラメータは、エクスポートされたプロパティを array('property' => value, ...) の形式で保持する 配列です。