2016-10-28 8 views
1

PHPのマニュアルのこの例がどのように動作するか説明できますか? ITSはPHPマニュアルから、この例のようにPDO 接続を確立するための魔法の方法を使用する利点は何ですかここhttp://php.net/manual/en/language.oop5.magic.phpPHPマジックメソッド__sleepと__wakeupとPDO接続

  1. ました。私はそれを取得しない、なぜ私はserialize()__sleep()__wakeup()を使用してデータベース接続を確立する必要がありますか?
  2. 接続が確立された後に が変数$linkになり、この クラスを子クラスに拡張して使用するにはどうすればよいですか?
  3. Connectionクラスを継承しない他のクラスに$ linkを渡すにはどうすればいいですか?唯一の方法はstaticですか?
  4. スクリプトの実行が終了したとき、またはオブジェクトのConnectionが破棄されたときに、PDOに接続を閉じるとどうやって終了しますか?

X

class Connection { 
    protected $link; 
    private $dsn, $username, $password; 

    public function __construct($dsn, $username, $password) { 
     $this->dsn  = $dsn; 
     $this->username = $username; 
     $this->password = $password; 
     $this->connect(); 
    } 

    private function connect() { 
     $this->link = new PDO($this->dsn, $this->username, $this->password); 
    } 

    public function __sleep() { 
     return array('dsn', 'username', 'password'); 
    } 

    public function __wakeup() { 
     $this->connect(); 
    } 
} 

答えて

1

PDO接続は異なるスクリプトの実行の間で保持されませんので、データベース接続を含むオブジェクトをシリアル化するときにそれらを含めるようにしようとする意味がありません。したがって、このクラスをシリアライズしてシリアル化していないときは、同等の接続を再確立する方法が必要です。

これは、Connectionオブジェクトをセッション変数に保存しようとする場合の例です。 PHPのセッション機能では、serialize()を使用して、データをファイルに保存するか、データベースに保存できる形式に変換します。

この例では、Connectionクラスはすべてのデータベースへのアクセス方法を前提としています。彼らはクラス定義全体を示しておらず、これらの魔法の使い方を実証するだけのものでした。実際のアプリケーションでは、$this->linkを返すgetLink()メソッドを使用するか、$this->linkを使用してクエリを実行する他のメソッドを追加します。 $this->link = null;を実行するclose()メソッドを追加することもできます。

0
  1. それは型破りだが、__sleepはシリアライズされたオブジェクトでご渡された資格情報を格納し、あなたがそれをデシリアライズするとき__wakeupそれを再確立します。ちょうどあなたが、たとえば、どこかにあなたのPHPスクリプトに保存されている定数を、このメソッドをオーバー選択した場合、どこにシリアライズされたデータは、
  2. linkが実際にPDOオブジェクト
  3. ちょうどゲッターを使用して保存しないあなたのDBの資格情報が含まれています保存することに注意してくださいメソッドPDOオブジェクトを取得する

    public function getConnection() { 
        return $this->link; 
    } 
    
  4. ほとんどの場合、接続を閉じる必要はありません。明示的に永続的でないすべての接続は、スクリプトがシャットダウンすると閉じられます。