2017-12-08 5 views
0

オブジェクトがunserizlize()のみを使用している可能性のあるリソースを再構築できるので、__wakeupというマジックメソッドを使用するとどうなりますか?文書によると

アンシリアライズ()マジック 名前__wakeupを持つ機能の有無をチェック()。存在する場合、この関数は、オブジェクトが持つ可能性があるすべての リソースを再構成できます。

__wakeup()の使用目的は、シリアル化中に失われた可能性のあるデータベース接続 を再確立し、 その他の再初期化タスクを実行することです。

私のオブジェクトは、私はまだunserialize()を使用して、私のオブジェクトの形式を再構築していることができ__wakeup()メソッドを定義していない場合は、なぜ、この魔法の方法は、PHPにあるのでしょうか?

ドキュメントは、と同じことを言っていますが、オブジェクトがunserialize()と同じように持つ可能性のあるリソースを再構築できます。

このマジックメソッド__wakeup()は、シリアル化を開始する前、またはシリアル化の終了後に呼び出されますか?

+1

'__wakeup()'は、非直列化の後でオブジェクトを返す前に実行されます。 'public function __wakeup(){var_dump($ this);}'のように、このメソッドで完全なオブジェクトと対話することができます。 – Scuzzy

答えて

1

このコードは、テストの1つのオブジェクトインスタンスをシリアル化するとデータベース接続が閉じられ、シリアル化されていない形式で保存されない場合があります。このオブジェクトをシリアル化しないと、__wakeup()メソッドはシリアル化解除時にデータベース接続を再確立しますこれらのリソースを直接使用することができます。非直列化時に$ objTest-> getUserInfo()を使用することができます。あなたは__wakeupを使って計算やファイルのオープンなどを行うことができます。

class Test 
{ 
    public $userId; 

    private $_db = null; 

    public function __wakeup() 
    { 
     if (null === $this->_db) 
     { 
      $this->_db = getConnection(); 
     } 
    } 

    public function getUserInfo(){ 
     $info = $this->_db->query("SELECT * FROM users WHERE id = " . intval($this->userId, 10)); 
     return $info; 
    } 
} 

function getConnection(){ 
    $user = "my_user_db"; 
    $password = "my_password_db"; 
    return new PDO('mysql:host=my_host_db;dbname=my_database', $user, $password); 
} 

$objTest = unserialize("O:4:\"Test\":2:{s:6:\"userId\";s:2:\"43\";s:9:\" Test _db\";N;}", ['Test']); 
$userInfo = $objTest->getUserInfo(); 
関連する問題