PHP のシリアル化は、永続オブジェクトをサポートしません。OOP では、永続オブジェクトは、複数のアプリケーション内の参照間で状態と機能を維持できるオブジェクトであり、オブジェクトをファイルまたはデータベースに保存できることを意味します。後でロードされます。これはいわゆるシリアル化メカニズムです。 PHP にはオブジェクトに対して呼び出すことができるシリアル化メソッドがあり、シリアル化メソッドはオブジェクトの文字列表現を返すことができます。ただし、シリアル化ではオブジェクトのメンバー データのみが保存され、メソッドは保存されません。
PHP4 では、オブジェクトを文字列 $s にシリアル化してからオブジェクトを解放し、オブジェクト
を $obj に逆シリアル化すると、オブジェクトのメソッドを引き続き使用できます。これを行うことはお勧めしません。(a) ドキュメントには、この動作が将来のバージョンでも機能するという保証がないからです。 (b) これにより、シリアル化されたバージョンをディスクに保存してスクリプトを終了するときに、誤解が生じる可能性があります。後でこのスクリプトを実行する場合、文字列表現にはメソッドがまったく含まれていないため、オブジェクトを逆シリアル化するときにオブジェクトのメソッドが存在することは期待できません。
つまり、PHP でのシリアル化は、オブジェクトのメンバー変数を保存するのに非常に役立ちます。 (関連する配列や配列をファイルにシリアル化することもできます)。
例:
コードをコピー コードは次のとおりです:
$obj=new Classfoo() ;
$str=serialize($obj);
//$str をディスクに保存
//数か月後
//ディスクから str をロード
$obj2=unserialize($str)
コードをコピーします コードは次のとおりです:
$obj=new $type();
$obj->action();
これは PHP の非常に優れた機能で、オブジェクトの種類を考慮せずに $obj の表示メソッドやその他のメソッドを呼び出すことができます。この手法を使用すると、新しいタイプのオブジェクトを追加するためにスクリプトを変更する必要はなく、それを処理するクラスを追加するだけで済みます。
この関数は非常に強力です。すべてのオブジェクトの型を考慮せずにメソッドを定義し、それらを異なるクラスの異なるメソッドに実装して、メイン スクリプトの任意のオブジェクトで使用します。 if...else は必要ありません。 2 人のプログラマーにとって、
はただ幸せです。
プログラミングは簡単で、メンテナンスは安価で、再利用可能であるということに同意されましたか?
プログラマーのグループを管理する場合、作業の割り当ては簡単です。各人がオブジェクトのタイプとそれを処理するクラスを担当することができます。
この技術を通じて国際化を実現できます。ユーザーが選択した言語分野などに応じて対応するクラスを適用するだけです。
コピーとクローン
$obj のオブジェクトを作成するとき、$obj2=$obj によってオブジェクトをコピーできます。新しいオブジェクトは $obj のコピー (参照ではありません) なので、$ を持ちます。その時のobjの状態。場合によっては、これを実行したくない場合もあります。obj クラスのような新しいオブジェクトを生成したい場合は、 new ステートメントを使用してクラスのコンストラクターを呼び出すことができます。これは、PHP でもシリアル化と基本クラスを通じて実現できますが、他のすべてのクラスは基本クラスから派生する必要があります。
危険ゾーンへの突入
オブジェクトをシリアル化すると、何らかの形式で文字列が得られます。興味があれば調べることができます。文字列にはクラスの名前が含まれています (
コードをコピーします コードは次のとおりです:
php
$herring=serialize($obj);
$vec=explode(':',$herring);
$nam=str_replace(""",'',$vec[2]) ;
コードは次のとおりです。 function clone() {
$herring=serialize($this); > $vec=explode(':',$herring);$nam=str_replace(""",'',$vec[2]);
$ret=new $nam;
return $ ret;
}
}
//その後
$obj=new Something()
//ユニバースから展開
$other=$obj->clone() ;
得られるのは、new メソッドを使用してコンストラクターを呼び出して作成されたオブジェクトと同じ、新しい Something クラスのオブジェクトです。これがうまくいくかどうかはわかりませんが、経験則として、ユニバース クラスは派生クラスの名前を知っていると考えられます。限界があるのは想像力だけです。
このステートメントは現在の時刻を書き込むものです。