要約: この記事では、著者が OOP の概念の理解に基づいた例を通じて、PHP のさまざまな高度な OOP テクノロジを示します。「想像力だけが限界です」と述べています
。より高度なテクニックを披露します。
シリアル化 (シリアル化)
PHP は永続オブジェクトをサポートしません。OOP では、永続オブジェクトは、複数のアプリケーションの参照間で状態と機能を維持できるオブジェクトです。これは、オブジェクトをファイルまたはデータベースに保存し、そのオブジェクトをロードできることを意味します。後で反対します。これはいわゆるシリアル化メカニズムです。 PHP にはオブジェクトに対して呼び出すことができるシリアル化メソッドがあり、シリアル化メソッドはオブジェクトの文字列表現を返すことができます。ただし、シリアル化ではオブジェクトのメンバー データのみが保存され、メソッドは保存されません。
PHP4 では、オブジェクトを文字列 $s にシリアル化してからオブジェクトを解放し、オブジェクトを $obj に逆シリアル化すると、オブジェクトのメソッドを引き続き使用できます。 (a) この動作が将来のバージョンでも機能するという保証がドキュメントにないため、これを行うことはお勧めしません。 (b) これにより、シリアル化されたバージョンをディスクに保存してスクリプトを終了するときに、誤解が生じる可能性があります。後でこのスクリプトを実行する場合、文字列表現にはメソッドがまったく含まれていないため、オブジェクトを逆シリアル化するときにオブジェクトのメソッドが存在することは期待できません。
全体として、PHP でのシリアル化は、オブジェクトのメンバー変数を保存するのに非常に役立ちます。 (関連する配列や配列をファイルにシリアル化することもできます)。
例:
<?php
$obj=new Classfoo();
$str=serialize($obj);
// $str をディスクに保存
// 数か月後
// str をディスクからロード
$obj2=アンシリアライズ($str)
メンバー データは復元されましたが、メソッドは復元されませんでした (ドキュメントによると)。これにより、メンバー変数にアクセスするには $obj2->x を使用するような方法しかなくなります (他に方法はありません)。自宅では試さないでください。
この問題を解決するにはいくつかの方法がありますが、この簡潔な記事ではあまりにもひどいので省略します。私は、PHP の次のバージョンでの完全にシリアル化された機能を喜んで歓迎します。
データ ストレージ用のクラスの使用 PHP と OOP の優れた点の 1 つは、何かを実行するクラスを簡単に定義し、それを使用したいときにいつでも対応するクラスを呼び出すことができることです。ユーザーが製品 ID 番号を選択して製品を選択できる HTML フォームがあるとします。データベースに製品情報があり、その製品とその価格などを表示したいとします。さまざまなタイプの製品があり、同じアクションでも製品ごとに異なる意味を持ちます。たとえば、サウンドを表示するということは、そのサウンドを再生することを意味する場合がありますが、他の種類の製品の場合は、データベースに保存されている画像を表示することを意味する場合があります。 OOP または PHP を使用すると、コーディングを削減し、品質を向上させることができます。
製品クラスを定義し、それに必要なメソッド (例: 表示) を定義してから、製品クラス (SoundItem クラス、ViewableItem クラスなど) から派生した、製品の各タイプのクラスを定義して、製品のメソッドをカバーします。クラスを使用して、希望どおりに動作させることができます。
データベース内の各製品のタイプ フィールドに従ってクラスに名前を付けます。一般的な製品テーブルには (ID、タイプ、価格、説明などのフィールド) が含まれます。その後、処理スクリプトでデータベースからクラスを取得できます。から type 値を取得し、type という名前のオブジェクトをインスタンス化します。
<?php
$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]);
のように取り出され
ます。したがって
、
「Universe」クラスを作成し、すべてのクラスを
強制的にユニバースから拡張すると仮定すると、次のようにユニバースで clone メソッドを定義できます
。
explode(':',$herring);
$nam=str_replace(""",'',$vec[2]);
$ret=new $nam;
return $ret;
}
}
/ /その後
$obj=new Something();
// ユニバースから展開
$other=$obj->clone();
取得するのは、新しい Something クラス オブジェクトです。これは、new メソッドを使用してコンストラクターを呼び出して作成されたオブジェクトと同じです。これがうまくいくかどうかはわかりませんが、経験則として、ユニバース クラスは派生クラスの名前を知っていると考えられます。限界があるのは想像力だけです。
このステートメントは現在の時刻を書き込みます。