ホームページ > php教程 > php手册 > 大規模な PHP プロジェクトを開発する方法

大規模な PHP プロジェクトを開発する方法

WBOY
リリース: 2016-06-13 12:34:20
オリジナル
910 人が閲覧しました

大規模な PHP プロジェクトを開発するための方法 1

この記事では、PHP のオブジェクト指向プログラミング (OOP、オブジェクト指向プログラミング) を紹介します。 OOP の概念と PHP のトリックを使用してコーディングを減らし、品質を向上させる方法を説明します。幸運を!



オブジェクト指向プログラミングの概念:
作成者によって意見が異なる場合がありますが、OOP 言語には次の側面が必要です:

抽象データ型および情報のカプセル化

継承

ポリモーフィズム


PHP では、カプセル化はクラスを通じて完了します:

------ ---- ---------------------------------------

クラス 何か {

// OOP クラスでは、通常、最初の文字は大文字です。

var $x;

function setX($v) {

//メソッドは小文字の単語で始まり、次に大文字を使用して単語を区切ります。たとえば、 getValueOfArea()

$this->x=$v;


}


function getX() {


return $this->x;


}


}


?>-------------------------------------- -- -------------

もちろん、自分の好みに応じて定義することもできますが、標準を維持することがより効果的です。


データ メンバーは、値が割り当てられる前は、「var」宣言を使用してクラス内で定義されます。データ メンバーには、整数、配列、連想配列、またはオブジェクトを指定できます。


メソッドはクラス内の関数として定義されます。メソッド内のクラス メンバー変数にアクセスする場合は、$this->name を使用する必要があります。それ以外の場合、メソッドにはローカル変数のみを使用できます。


new 演算子を使用してオブジェクトを作成します:
$obj=new Something;

その後、次のようにメンバー関数を使用できます:

$obj- >setX(5);

$see=$obj->getX();


この例では、setX メンバー関数は、オブジェクト x (クラスに属さない) の場合、getX はその値 5 を返します。


$obj->x=6 のようなクラス参照を通じてデータ メンバーにアクセスできます。これは OOP の良い習慣ではありません。メソッドを通じてメンバー変数にアクセスすることを強くお勧めします。メンバー変数を操作不可能なものとして扱い、オブジェクト ハンドルを通じてのみメソッドを使用すれば、優れた OOP プログラマーになれるでしょう。残念ながら、PHP はプライベート メンバー変数の宣言をサポートしていないため、PHP では不正なコードが許可されています。

継承は PHP で簡単に実装でき、extend キーワードを使用するだけです。

------------------------------------------ ------ ---------
class Another extends Something {


var $y;


function setY($v ) {


$this->y=$v


}


関数 getY() {

return $this-> ;y;

}


}


?> 「Another」クラスのオブジェクトにはすべてのデータが含まれています親クラス (Something) のメンバーとメソッドに加えて、独自のデータ メンバーとメソッド。



$obj2=new 何か;

$obj2->setX(6);

$obj2->setY( 7) を使用できます。 );

PHP は現在多重継承をサポートしていないため、2 つ以上のクラスから新しいクラスを派生することはできません。


派生クラスでメソッドを再定義できます。「Another」クラスで getX メソッドを再定義すると、「Something」で getX メソッドを使用できなくなります。派生クラスで基本クラスと同じ名前のデータ メンバーを宣言すると、それを扱うときに基本クラスのデータ メンバーが「隠蔽」されます。

クラス内でコンストラクターを定義できます。コンストラクターは、クラス名と同じ名前のメソッドです。たとえば、次のように、クラスのオブジェクトを作成するときに呼び出されます。 --- ---------------------------------------------------
クラス 何か {

var $x;


関数 何か($y) {

$this->x=$y; >
}

function setX($v) {

$this->x=$v;


function getX() {

return $this->x


}

?>-- ----------- --------------------------------------------

オブジェクトを作成するには、次のように渡します。

$obj=new Something(6);

コンストラクターは、データ変数 x に 6 を自動的に割り当てます。コンストラクターとメソッドは通常の PHP 関数であるため、デフォルトのパラメーターを使用できます。

function Something($x="3",$y="5")

その後:

$obj=new Something(); // x=3 and y=5


$obj=new Something(8); // x=8 および y=5


$obj=new Something(8,9); ; // x=8 および y=9

デフォルトのパラメータは C メソッドを使用するため、Y の値を無視して X にデフォルトのパラメータを与えることはできません。
渡されたパラメータが必須パラメータよりも小さい場合、デフォルトのパラメータが使用されます。


派生クラスのオブジェクトが作成されるとき、そのコンストラクターのみが呼び出され、基底クラスのコンストラクターを呼び出したい場合は、親クラスのコンストラクターは呼び出されません。
関数を使用するには、派生クラスのコンストラクターで明示的に呼び出す必要があります。これが可能なのは、親クラスのすべてのメソッドが派生クラスで使用できるためです。


----------------------------------------------------- ------------

function Another() {


$this->y=5;

$this- >Something();

//呼び出し元の基本クラス コンストラクター

}


?>---------- -- --------------------------------------

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(); 🎜>
//$this->name() は一般的に間違っていることに注意してください。ただし、ここで $name は、

}

function Myclass1 と呼ばれるメソッドの名前です。 ($x) {

コード;

}
関数 Myclass2($x,$y) {

コード;

}

}

?>

このクラスの使用は、クラス内の追加処理を通じてユーザーに透過的です:


$obj1= new Myclass( '1'); //Myclass1 は

$obj2=new Myclass('1','2'); //Myclass2 は

と呼ばれます。


ポリモーフィズム

ポリモーフィズムは、実行時に渡されたオブジェクト パラメーターに基づいて呼び出すオブジェクト メソッドを決定できます。たとえば、Figure クラスがある場合は、draw メソッドを定義します。そして、circle クラスと Rectangle クラスを派生し、派生クラスでdraw メソッドをオーバーライドし、パラメーター x を予期し、$x->draw() を呼び出すことができる関数を持つこともできます。ポリモーフィズムがある場合、どの描画メソッドが呼び出されるかは、関数に渡すオブジェクトのタイプによって異なります。


PHP のようなインタープリター型言語のポリモーフィズム (C コンパイラーがこのようなコードを生成すると想像してください。どのメソッドを呼び出す必要がありますか?また、オブジェクトのタイプもわかりません。まあ、そうではありません)ポイント)とても簡単で自然です。したがって、当然のことながら、PHP はポリモーフィズムをサポートします。

------------------------------------------ ------ ---------
function niceDrawing($x) {

//これが Board クラスのメソッドであると仮定します

$x ->draw();

}

$obj=新しい円(3,187);

$obj2=新しい四角形(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();
>
これは PHP の非常に優れた機能で、オブジェクトの種類を考慮せずに $obj の表示メソッドやその他のメソッドを呼び出すことができます。この手法を使用すると、新しいタイプのオブジェクトを追加するためにスクリプトを変更する必要はなく、それを処理するクラスを追加するだけで済みます。


この関数は非常に強力です。すべてのオブジェクトの型を考慮せずにメソッドを定義し、それらを異なるメソッドの異なるクラスに実装し、メイン スクリプト内の任意のオブジェクトで使用します。 ...それ以外の場合は、プログラマーを 2 人必要とせず、ただ幸せになるだけです。


プログラミングは簡単で、メンテナンスは安価で、再利用可能であることに同意しますか?

プログラマーのグループを管理する場合、各人がオブジェクトの種類とそれを処理するクラスを担当することは非常に簡単です。


この技術を通じて国際化を実現できます。ユーザーが選択した言語分野などに応じて対応するクラスを適用するだけです。



コピーとクローン
$obj のオブジェクトを作成するとき、$obj2=$obj によってオブジェクトをコピーでき、新しいオブジェクトは $obj のコピーになります (参照ではありません)ので、その時点の $obj の状態になります。場合によっては、これを実行したくない場合もあります。obj クラスのような新しいオブジェクトを生成したい場合は、 new ステートメントを使用してクラスのコンストラクターを呼び出すことができます。これは、PHP でもシリアル化と基本クラスを通じて実現できますが、他のすべてのクラスは基本クラスから派生する必要があります。




危険ゾーンに入る

オブジェクトをシリアル化すると、何らかの形式で文字列が得られます。興味があれば調べることができます。この文字列にはクラス名が含まれており (すばらしい!)、次のように取り出すことができます:

----------------- -- ----------
$herring=serialize($obj);

$vec=explode(':', $herring );

$nam=str_replace(""",'',$vec[2]);
?>


それで、「ユニバース」を作成するとします。 " class を作成し、すべてのクラスを強制的にユニバースから拡張します。次のように、ユニバースでクローン メソッドを定義できます:

-------------- ------ ---------------
クラス Universe {

function clone() {

$herring=serialize($ this);
$vec=explode(':',$herring);

$nam=str_replace(""",'',$vec[2]);

$ret= new $nam;
return $ret;

}
//次に
$obj=new Something(); >//ユニバースから拡張
$other=$obj->clone();

?>

得られるものは、Something クラスのオブジェクトですnew メソッドを使用してコンストラクターを呼び出して作成されたオブジェクトと同じです。これがうまくいくかどうかはわかりませんが、経験則として、ユニバース クラスは派生クラスの名前を知っていると考えられます。限界があるのは想像力だけです。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート