プロジェクト
ポリモーフィズム
ポリモーフィズムとは、実行時に渡されたオブジェクトのパラメータに基づいて、どのオブジェクトのメソッドを呼び出すかを決定できます。たとえば、
Figure クラスがある場合は、draw メソッドが定義されます。そして、circle クラスと Rectangle クラスを派生し、派生クラスでdraw メソッドをオーバーライドし、パラメーター x の使用を予期し、$x->draw() を呼び出すことができる関数を持つこともできます。ポリモーフィズムがある場合、
どの描画メソッドが呼び出されるかは、この関数に渡すオブジェクトのタイプによって異なります。
PHP のようなインタープリター型言語のポリモーフィズム (C++ コンパイラーがこのようなコードを生成すると想像してください。どのメソッドを呼び出す必要がありますか?
持っているオブジェクトのタイプがわかりません。まあ、それは重要ではありません)) は非常に簡単ですそして自然です。したがって、当然のことながら、PHP はポリモーフィズムをサポートします。
function niceDrawing($x) {
//これが Board クラスのメソッドであると仮定します
$x->draw()
}
$obj=new Circle(3,187 );
$obj2=new Rectangle(4,5);
$board->niceDrawing($obj);
//Circle の描画メソッドは
$board->niceDrawing($obj2) と呼ばれます;
//Rectangle のdrawメソッドが呼び出されます
?>
PHPによるオブジェクト指向プログラミング
一部の「純粋主義者」は、PHPは真のオブジェクト指向言語ではないと言うかもしれませんが、これは真実です。 PHP はハイブリッド言語です。OOP または従来の手続き型プログラミングを使用できます。ただし、大規模なプロジェクトの場合は、PHP で
純粋な OOP を使用してクラスを宣言し、プロジェクト内でオブジェクトとクラスのみを使用する必要がある場合があります。
プロジェクトが大きくなるにつれて、OOP コードは保守しやすく、理解しやすく、再利用しやすいです。これらはソフトウェアエンジニアリングの基礎です
。これらの概念を Web ベースのプロジェクトに適用することが、将来の Web サイトの成功の鍵となります。
PHP の高度な OOP テクノロジー
OOP の基本的な概念を理解した後、より高度なテクノロジーを紹介します。
シリアライズ (直列化)
PHP は永続オブジェクトをサポートしていません。OOP では、永続オブジェクトを複数のオブジェクトに格納できます。アプリケーションの参照内で状態と機能を維持します。これは、オブジェクトをファイルまたはデータベースに保存し、後でオブジェクトをロードする機能を備えていることを意味します。これはいわゆるシリアル化メカニズムです。 PHP にはオブジェクトを通じて呼び出すことができるシリアル化メソッドがあり、オブジェクトの文字列表現を返すことができます。ただし、シリアル化では
オブジェクトのメンバー データのみが保存され、メソッドは保存されません。
PHP4 では、オブジェクトを文字列 $s にシリアル化してからオブジェクトを解放し、オブジェクトを $obj に逆シリアル化すると、オブジェクトのメソッドを引き続き
使用できます。これを行うことはお勧めしません。(a) ドキュメントには、この動作が将来のバージョンでも機能するという保証がないからです。 (b)
これは、シリアル化されたバージョンをディスクに保存してスクリプトを終了するときに誤解を招く可能性があります。後でこのスクリプトを実行するとき、文字列表現にはメソッドがまったく含まれていないため、オブジェクトを逆シリアル化するときにオブジェクトのメソッドが存在することは期待できません。
要するに、PHPにおけるシリアル化は、オブジェクトのメンバ変数を保存するのに非常に便利です。 (関連する配列や配列を
ファイルにシリアル化することもできます)。
例:
------------------------------------------ ------ --------
$obj=new Classfoo();
$str=serialize($obj); // $str をディスクに保存します
//何ヶ月後
//ディスクから str をロード
$obj2=unserialize($str)
?>------------------ --- ----------------------------------
メンバーデータは復元されましたが、メソッドは復元されませんでした(ドキュメントによると)。これにより、
メンバー変数にアクセスするには、$obj2->x を使用するなどの唯一の方法が必要になるため (他に方法はありません!)、自宅では試さないでください。
この問題を解決するにはいくつかの方法がありますが、この簡潔な記事にはあまりにももったいないので省略します。
私は、PHP の次のバージョンで完全にシリアル化された機能を喜んで歓迎します。
データ ストレージにクラスを使用する
PHP と OOP の非常に優れた点の 1 つは、何かを行うためのクラスを簡単に定義し、それを使用したいときにいつでも対応するクラスを呼び出すことができることです
。ユーザーが製品 ID 番号を選択して製品を選択できる HTML フォームがあるとします。データベースに製品情報があり、その製品とその価格などを表示したい。さまざまな種類の製品があり、同じアクション
が製品ごとに異なる意味を持つ場合があります。たとえば、サウンドを表示するということは、それを再生することを意味する場合がありますが、他の種類の製品の場合は、データベースに保存されている画像を表示することを意味する場合があります。 OOP または PHP を使用すると、コーディングを減らして品質を向上させることができます:
製品クラスを定義し、それに必要なメソッド (例: 表示) を定義してから、製品クラス (SoundItem クラス、ViewableItem クラスなど) から派生した製品のタイプごとにクラスを定義します。これについては、「メソッド」で説明します。製品クラスを使用して、希望どおりに動作させることができます。
データベース内の各製品の type フィールドに従ってクラスに名前を付けます。一般的な製品テーブルには (id、type、price、
description などのフィールド) がある場合があります。その後、処理スクリプトで、次の情報を取得できます。データベースから type 値を取得し、type という名前のオブジェクトをインスタンス化します
:
-------------------------------- ------------------------
$obj=new $type();
$obj->action( );
?>------------------------------------------ ------ --------
これはPHPの非常に優れた機能で、オブジェクトの種類を考慮せずに$objの表示メソッドやその他のメソッドを呼び出すことができます。この手法を使用すると、新しいタイプのオブジェクトを追加するためにスクリプトを変更する必要はなく、それを処理するクラスを追加するだけで済みます。
この関数は非常に強力です。すべてのオブジェクトの型を考慮せずにメソッドを定義し、それらを異なるメソッドの異なるクラスに実装し、メイン スクリプトの任意のオブジェクトで使用します。if...else は必要ありません。二人のプログラマー、ただ幸せです。
プログラミングは簡単で、メンテナンスは安価で、再利用可能であるということに同意されましたか?
プログラマーのグループを管理する場合、仕事の割り当ては非常に簡単で、各人がオブジェクトの種類とそれを処理するクラスを担当することができます。
この技術を通じて国際化を実現できます。ユーザーが選択した言語分野に応じて対応するクラスを適用するだけです。
コピーとクローン
$obj のオブジェクトを作成するとき、$obj2=$obj によってオブジェクトをコピーできます。新しいオブジェクトは $obj のコピー (参照ではありません) なので、$ の状態になります。その時のオブジェ。場合によっては、これを実行したくない場合もあります。obj クラスのような新しいオブジェクトを生成したい場合は、 new ステートメントを使用してクラスのコンストラクターを呼び出すことができます。 PHP では、シリアル化と基本クラスを通じてこれを実現することもできますが、他のすべてのクラスは基本クラスから派生する必要があります。
危険ゾーンに入りましょう
オブジェクトをシリアル化すると、何らかの形式で文字列が得られます。興味がある場合は、その文字列にクラスの名前が付いていることを調べてください。次のように取り出すことができます:
----------------------------------------------------- ---- ------------------
$herring=serialize($obj);
$vec=explode(':',$herring );
$nam =str_replace(""",'',$vec[2]);
?>---------------------- -------- -----------------------
つまり、「Universe」クラスを作成し、すべてのクラスを強制的にユニバースから拡張すると仮定します。では、次のようにユニバース
でクローン メソッドを定義できます:
------------------------------------------------- ---- ----------------
class Universe {
function clone() {
$herring=serialize($this);
$vec= explode(': ',$herring);
$nam=str_replace(""",'',$vec[2]);
$ret=new $nam;
return $ret;
}
}
/ /その後
$ obj=new Something();
//Universe から拡張
$other=$obj->clone();
?> ---- ----------------------------------
得られるのは、新しいSomethingクラスのオブジェクトです。これは new メソッドを使用した場合と同じであり、コンストラクターを呼び出して作成されるオブジェクトは同じです。これがうまくいくかどうかはわかりませんが、Universe クラスが派生クラスの名前を知っているというのは経験則です。限界があるのは想像力だけです。
注: 私は PHP4 を使用していますが、私が書いたものの一部は PHP3 では動作しない可能性があります。
<全文終了>