大規模な PHP プロジェクトを開発するための方法 1
この記事では、PHP におけるオブジェクト指向プログラミング (OOP、オブジェクト指向プログラミング) を紹介します。 OOP の概念と PHP のトリックを使用してコーディングを減らし、品質を向上させる方法を説明します。幸運を!
オブジェクト指向プログラミングの概念:
作成者によって意見が異なる場合がありますが、OOP 言語には次の側面が必要です:
抽象データ型と情報のカプセル化
継承
ポリモーフィズム
カプセル化が完了するクラスを介した PHP の説明:
------------------------------------------------------ -- -----------
class Something {
// OOP クラスでは、通常、最初の文字は大文字です
var $x;
function setX($v) {
// メソッドgetValueOfArea()
$this->x=$v;
}
function getX() {
return $ this-> のように、小文字の単語で始めて単語を区切ります。 ;x;
}
}
?>-------------------------------- - -------------------------
もちろん、自分の好みに応じて定義することもできますが、標準を維持することが最善です。より効果的になります。
データ メンバーは、クラス内で「var」宣言を使用して定義されます。値が割り当てられる前は、データ メンバーには型がありません。データ メンバーには、整数、配列、連想配列、またはオブジェクトを指定できます。
メソッドはクラス内の関数として定義されます。メソッド内のクラス メンバー変数にアクセスする場合は、$this->name を使用する必要があります。それ以外の場合、メソッドの場合はローカル変数のみにすることができます。
new 演算子を使用してオブジェクトを作成します:
$obj=new Something;
その後、次のようにメンバー関数を使用できます:
$see=$obj-> ;getX();
この例では、setX メンバー関数はオブジェクトのメンバー変数 x (クラスではない) に 5 を代入し、getX はその値 5 を返します。
$obj->x=6 のようなクラス参照を通じてデータ メンバーにアクセスできます。これは OOP の良い習慣ではありません。メソッドを通じてメンバー変数にアクセスすることを強くお勧めします。メンバー変数を操作不可能なものとして扱い、オブジェクト ハンドルを介してのみメソッドを使用すれば、優れた OOP プログラマーになれるでしょう。残念ながら、PHP はプライベート メンバー変数の宣言をサポートしていないため、PHP では不正なコードが許可されています。
継承は PHP で簡単に実装でき、extend キーワードを使用するだけです。
------------------------------------------------ ---- aClass Another は何かを拡張します {
var $ Y; () {
return $this->y
}
?>プロジェクト (2)
「別の」クラス オブジェクトには、親クラス (Something のすべてのデータ メンバーとメソッド) に加えて、独自のデータ メンバーとメソッドがあります。
$obj2=new Something;
$obj2->setY(7); を使用できます。 2 つ以上のクラスから新しいクラスを派生することはできません。
派生クラスでメソッドを再定義できます。「Another」クラスで getX メソッドを再定義すると、「Something」で getX メソッドを使用できなくなります。派生クラスで基本クラスと同じ名前のデータ メンバーを宣言すると、それを扱うときに基本クラスのデータ メンバーが「隠蔽」されます。
クラス内でコンストラクターを定義できます。コンストラクターはクラス名と同じ名前のメソッドで、クラスのオブジェクトを作成するときに呼び出されます。例:
----------------- --- --------------------------------
クラス 何か {
var $x;
関数 何か($y ) {
$this->x=$y;
}
関数 setX($v) {
$this->x=$v;
関数 getX( ) {
return $this->x
}
}
?>---------------------- - ------------
次のようにしてオブジェクトを作成できます。
$obj=new Something(6);
コンストラクターは次のようにします。データ変数 x に 6 を自動的に代入します。コンストラクターとメソッドは通常の PHP 関数であるため、デフォルトのパラメーターを使用できます。
function Something($x="3",$y="5")
次に:
$obj=new Something() // x=3 および y=5
$obj=new Something (8); // x=8 および y=5
$obj=new Something(8,9); // x=8 および y=9
デフォルトのパラメータは無視できませんY の値、およびデフォルトのパラメータが X に与えられます。パラメータは左から右に割り当てられます。渡されたパラメータが必要なパラメータより小さい場合は、デフォルトのパラメータが使用されます。
派生クラスのオブジェクトが作成されるとき、そのコンストラクターのみが呼び出され、親クラスのコンストラクターは呼び出されません。基本クラス
のコンストラクターを呼び出したい場合は、派生クラスのコンストラクター 関数内の呼び出しを表示します。これが可能なのは、親クラスのすべてのメソッドが派生クラスで使用できるためです。
---------------------------------------------- --- ------
function Another() {
$this->y=5;
//基本クラスのコンストラクター呼び出しを表示します
}
?>------------------------------------------ ------ ------
OOP の優れたメカニズムは、抽象クラスを使用することです。抽象クラスはインスタンス化できず、派生クラスへのインターフェイスのみを提供できます。設計者は多くの場合、抽象クラスを使用してプログラマに基本クラスからの派生を強制し、新しいクラスに必要な機能が確実に含まれるようにします。 PHP には標準メソッドはありませんが、:
この機能が必要な場合は、基本クラスを定義し、そのコンストラクターの後に「die」呼び出しを追加して、基本クラスがインスタンス化できないようにすることができます。各メソッド (インターフェイス) の後に「die」ステートメントがあるため、プログラマが派生クラスのメソッドをオーバーライドしない場合、エラーが発生します。また、PHP は型指定されていないため、オブジェクトが基底クラスからの派生クラスであることを確認し、クラスの ID を定義する (ある種の識別 ID を返す) メソッドを基底クラスに追加する必要がある場合があります。オブジェクトパラメータを受け取るときにこの値を確認してください。もちろん、邪悪なプログラマーが派生クラスでこのメソッドをオーバーライドした場合、このメソッドは機能しませんが、一般に問題は邪悪なプログラマーではなく怠惰なプログラマーに見られます。
もちろん、基本クラスをプログラマに見えないようにして、インターフェイスを出力するだけで仕事を実行できるのは素晴らしいことです。
PHP にはデストラクターはありません。
大規模なPHPプロジェクトの開発方法(3)
PHPではオーバーロード(上書きとは異なります)はサポートされていません。 OOP では、メソッドをオーバーロードして、名前は同じでパラメータの数やタイプが異なる 2 つ以上のメソッド (言語に応じて異なります) を実装できます。 PHP は型付けが緩い言語であるため、型によるオーバーロードは機能しませんが、異なる数のパラメーターによるオーバーロードも機能しません。
異なるメソッド (異なる数のパラメーターを渡す) でオブジェクトを作成できるように、OOP でコンストラクターをオーバーロードすると良い場合があります。 PHP でこれを実現するコツは次のとおりです:
-------------------------------------- --
class Myclass {
function Myclass() {
$name="Myclass".func_num_args();
$this->$name(); ) は通常エラーですが、ここで $name は呼び出されるメソッドの名前です
}
function Myclass1($x) {
code;
}
function Myclass2($x,$y) {
code;
}
?>
このクラスの使用は、クラス内の追加処理を通じてユーザーに透過的です。
$obj1=new Myclass('1'); be call
$obj2=new Myclass('1','2'); //Myclass2 が呼び出されます
これは非常に便利な場合があります。
ポリモーフィズム
ポリモーフィズムは、実行時に渡されたオブジェクトパラメータに基づいてどのオブジェクトメソッドを呼び出すかを決定できます。たとえば、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 の描画メソッドは
と呼ばれます?>
PHP によるオブジェクト指向プログラミング
一部の「純粋主義者」は、PHP は真のオブジェクト指向言語ではないと言うかもしれません。事実。 PHP はハイブリッド言語であり、OOP または従来の手続き型プログラミングを使用できます。ただし、大規模なプロジェクトの場合は、純粋な OOP を使用して PHP でクラスを宣言し、プロジェクト内でオブジェクトとクラスのみを使用する必要がある場合があります。
プロジェクトが大きくなるにつれて、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 プロジェクトを開発する方法 (4)
データ ストレージにクラスを使用する
PHP と OOP の非常に良い点の 1 つは、何かを操作するためのクラスを簡単に定義でき、いつでも対応するクラスを呼び出すことができることです。使いたいです。ユーザーが製品 ID 番号を選択して製品を選択できる HTML フォームがあるとします。データベースに製品情報があり、その製品とその価格などを表示したいとします。さまざまなタイプの製品があり、同じアクションでも製品ごとに異なる意味を持ちます。たとえば、サウンドを表示するということは、そのサウンドを再生することを意味する場合がありますが、他の種類の製品の場合は、データベースに保存されている画像を表示することを意味する場合があります。 OOP または PHP を使用してコーディングを減らし、品質を向上させることができます:
製品のクラスを定義し、それに必要なメソッド (例: 表示) を定義してから、製品クラスから派生した製品のタイプごとにクラスを定義します ( SoundItem クラス、ViewableItem クラスなど)、製品クラスのメソッドをオーバーライドして、必要に応じて動作させます。
データベース内の各製品のタイプフィールドに応じてクラスに名前を付けます。一般的な製品テーブルには (ID、タイプ、価格、説明などのフィールド) が含まれる場合があります。その後、処理スクリプトで次の情報を取得できます。データベースから type 値を取得し、type という名前のオブジェクトをインスタンス化します:
--------------------------------- --
$obj=new $type();
$obj->action();
これは、オブジェクトの型を考慮せずに $ を呼び出すことができる、非常に優れた機能です。 objの表示メソッドやその他のメソッド。この手法を使用すると、新しいタイプのオブジェクトを追加するためにスクリプトを変更する必要はなく、それを処理するクラスを追加するだけで済みます。
この関数は非常に強力です。すべてのオブジェクトの型を考慮せずにメソッドを定義するだけで、それらを異なるクラスの異なるメソッドに実装して、メイン スクリプトの任意のオブジェクトで使用できます。 if...else は不要です。プログラマーは 2 人必要ですが、それだけで幸せです。
プログラミングは簡単で、メンテナンスは安価で、再利用可能であることに同意しますか?
プログラマーのグループを管理している場合、作業の割り当ては非常に簡単で、各人がオブジェクトの種類とそれを処理するクラスを担当することができます。
この技術を通じて国際化を実現できます。ユーザーが選択した言語分野などに応じて対応するクラスを適用するだけです。
コピーとクローン
$obj のオブジェクトを作成するとき、$obj2=$obj によってオブジェクトをコピーできます。新しいオブジェクトは $obj のコピーなので、$obj 状態になります。その時。場合によっては、これを実行したくない場合もあります。obj クラスのような新しいオブジェクトを生成したい場合は、 new ステートメントを使用してクラスのコンストラクターを呼び出すことができます。これは、PHP でもシリアル化と基本クラスを通じて実現できますが、他のすべてのクラスは基本クラスから派生する必要があります。
危険ゾーンに入りましょう
オブジェクトをシリアル化すると、何らかの形式で文字列が得られます。興味があれば調べてみてください。文字列にはクラスの名前があります(素晴らしい)、次のように取り出すことができます:
------------------------------------------------- ---- -
$herring=serialize($obj);
$vec=explode(':',$herring);
$nam=str_replace(""",'',$vec[2]) ;
?> ;
したがって、「Universe」クラスを作成し、すべてのクラスを強制的にユニバースから拡張すると仮定すると、次のようにユニバースで clone メソッドを定義できます。 ------------------------
クラス Universe {
function clone() {
$herring=serialize($ this); =explode(':',$herring);
$nam=str_replace(""",'',$vec[2]);
$ret=new $nam;
return $ret;
}
}
//その後
$obj=new Something();
//Universe から拡張
?>クラス オブジェクト。これは、new メソッドを使用し、コンストラクターを呼び出して作成されたオブジェクトと同じです。これがうまくいくかどうかはわかりませんが、経験則として、ユニバース クラスは派生クラスの名前を知っていると考えられます。限界があるのは想像力だけです。
http://www.bkjia.com/PHPjc/317679.html
www.bkjia.com
true