ホームページ  >  記事  >  バックエンド開発  >  PHP におけるオブジェクト指向プログラミング: 大規模な PHP プロジェクトへの道

PHP におけるオブジェクト指向プログラミング: 大規模な PHP プロジェクトへの道

WBOY
WBOYオリジナル
2016-07-29 08:35:27898ブラウズ

この記事では、PHP のオブジェクト指向プログラミング (OOP) について紹介します。オブジェクト指向の概念を使用して、より少ないコードでより優れたプログラムを作成する方法を示します。皆さんの幸運を祈ります。
オブジェクト指向プログラミングの概念は、作者ごとに異なる見解があります。オブジェクト指向言語が持つべきものを思い出させてください:
- データの抽象化と情報の隠蔽
- 継承
- ポリモーフィズム
PHP で使用されるクラスのカプセル化方法:
class Something {
// OOP では通常、クラスの名前は大文字で始まります
var $x;
function setX($v) {
// 小文字で始まり、小文字で区切られます
return $this->x;
}
}
?>
もちろん独自のメソッドを使用することもできますが、標準を持っていることは常に良いことです。
PHPのクラスのデータメンバーは、値が割り当てられるまでは「var」を使用して定義されます。データ メンバーは、整数、配列、連想配列 (連想配列)、またはオブジェクトの場合があります。メソッドは、クラス内の関数として定義されます。メソッド内のデータ メンバーにアクセスするには、次のように $this->name を使用する必要があります。このメソッド、それ以外の場合は、メソッドの関数のローカル変数です。
new を使用してオブジェクトを作成します
$obj = new Something;
その後、メンバー関数を使用します
$obj->getX();
setX メンバー関数は次のようになります。 assign 5 obj のメンバー変数をオブジェクト (クラスではなく) に与えると、getX は値 5 を返します。
オブジェクト参照を使用してメンバー変数にアクセスすることもできます。たとえば、 $obj->x=6;これは、オブジェクト指向プログラミングのアプローチとしては適切ではありません。メンバー変数の値を設定するにはメンバー関数を使用し、メンバー変数を読み取るにはメンバー関数を使用することを強くお勧めします。メンバー関数を使用する以外はメンバー変数にアクセスできないと信じているなら、あなたは優れたオブジェクト指向プログラマーになれるでしょう。しかし残念ながら、PHP 自体には変数をプライベートとして宣言する方法がないため、不正なコードが存在することが許されています。
PHPにおける継承はextendを使って宣言します。
class Another extends Something {
var $y;
function setY($v) {
メソッドは小文字で始まり、小文字で区切られます
// メソッド名の例 getValueOfArea()
$ this- >y=$v; }
function getY() {
return $this->y; }
}
?>
このように、クラス「Another」のオブジェクトには、親クラスとメソッド関数、さらに独自のメンバー変数とメンバー関数。例:
$obj2=new Another;
$obj2->setX(6);
$obj2->setY(7);
複数のクラスを継承させることはできません。
継承されたクラスでは、メソッドを再定義するために再定義できます。「Another」で getX を再定義すると、同様に、メンバー変数の名前が同じである場合は、「Something」のメンバー関数 getX にアクセスできなくなります。親クラスの場合、継承されたクラス変数は同じ名前の親クラス変数を非表示にします。
クラスのコンストラクターを定義できます。コンストラクターは、クラスのオブジェクトを作成するときに呼び出される、クラスと同じ名前のメンバー関数です。
class Something {
var $x;
function Something($y) {
$this->x=$y;
}
function setX($v) {
$this->x =$v;
}
function getX() {
return $this->x;
構造 この関数は、メンバー変数 x に値 5 を自動的に代入します。デフォルトのパラメータを使用できます。
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
デフォルトのパラメータは C++ と同じ方法で定義されているため、値を渡すことはできません。 Y ですが、X にはデフォルト値が使用され、実際のパラメータが左から右に渡されます。実際のパラメータがなくなると、関数はデフォルトのパラメータを使用します。
継承クラスのコンストラクタが呼び出されたときのみ、継承クラスのオブジェクトが作成され、親クラスのコンストラクタは呼び出されないのがPHPの特徴です。コンストラクター呼び出しチェーンはオブジェクト指向プログラミングの特徴です。基本クラスのコンストラクターを呼び出したい場合は、継承クラスのコンストラクターで明示的に呼び出す必要があります。これが機能するのは、親クラスのすべてのメソッドが継承されたクラスで使用できるためです。
function Another() {
$this->y=5;
$this->Something(); // オブジェクト内でプログラミングにおける優れたメカニズムは、抽象クラスを使用することです。抽象クラスはインスタンス化できませんが、継承されたクラスのインターフェイスを定義するために使用されます。デザイナーは、プログラマに特定の基本クラスからのみ継承させるために抽象クラスをよく使用します。これにより、新しいクラスが必要な機能を備えていることを確認できますが、PHP にはこれを行う標準的な方法はありません。これは、コンストラクターで「die」を呼び出すことで基本クラスを定義するときに必要になるため、プログラマが継承する場合は、抽象クラスの関数を定義し、各関数で「die」を呼び出すことができます。クラス内で基本クラスの関数を再定義せずに直接呼び出すとエラーが発生します。さらに、PHP には型がないため、一部のオブジェクトは基本クラスから継承する継承クラスから作成されることを確認する必要があります。そのため、クラスを識別するメソッド (「何らかの識別子」を返す) を基本クラスに追加し、これを検証します。受け取ったときにオブジェクトにパラメータとして渡すと便利です。しかし、不正なプログラムは継承クラスでこの関数を再定義できるため、この方法は通常、怠惰なプログラマにしか機能しません。もちろん、最善の方法は、プログラムが基本クラスのコードに触れないようにして、インターフェイスのみを提供することです。
PHPではオーバーロードはサポートされていません。オブジェクト指向プログラミングでは、異なるパラメーターの型と数値を定義することによって、同じ名前のメンバー関数をオーバーロードできます。 PHP は型付けが緩い言語であるため、パラメーターの型のオーバーロードは役に立ちません。同様に、異なる数のパラメーターを使用したオーバーロードも機能しません。
オブジェクト指向プログラミングでは、コンストラクターをオーバーロードすると、さまざまな方法 (さまざまな数のパラメーターを渡すことによって) でさまざまなオブジェクトを作成できる場合に便利です。ちょっとしたトリックでこれを行うことができます:
class Myclass {
function Myclass() {
$this->$name();
/ / に注意してください。 $this->$name() は通常は間違っていますが、ここでは
//$name は呼び出すメソッドの名前を含む文字列です
}
function Myclass1($x) {
code;
function Myclass2($) x,$y) {
Myclass2($x,$y)
$obj1=new Myclass(1); //Myclass1 を呼び出します
$obj2=new Myclass(1,2); //Myclass2 を呼び出します
かなり良い感じです!
ポリモーフィズム
ポリモーフィズムは、実行時にオブジェクトがパラメーターとして渡されたときに、どのメソッドを呼び出すかを決定するオブジェクトの機能として定義されます。たとえば、クラスを使用してメソッド "draw" を定義し、そのクラスを継承して円または正方形を描く "draw" の動作を再定義すると、パラメータ x を持つ関数が得られます。 call $x->draw( ) ポリモーフィズムがサポートされている場合、「draw」メソッドの呼び出しはオブジェクト x のタイプによって異なります。ポリモーフィズムは PHP で当然サポートされています (C++ コンパイラーでコンパイルされた場合、どのメソッドが呼び出されるか考えてみてください。ただし、オブジェクトの型が何であるかはわかりません。もちろん、現在はそうではありません)。幸いなことに、PHP はポリモーフィズムをサポートしています。
function niceDrawing($x) {
//これがクラス Board のメソッドであるとします
$x->draw();
$obj=new Circle(3,187); obj2=new Rectangle(4,5);
$board->niceDrawing($obj); //Circle の描画メソッドを呼び出します。 Rectangle のメソッド
?>
PHP におけるオブジェクト指向プログラミング
純粋なオブジェクト理論家は、PHP は真のオブジェクト指向言語ではないと信じていますが、それは正しいことです。 PHP はハイブリッド言語であり、オブジェクト指向または従来の構造プログラミング手法と併用できます。ただし、大規模なプロジェクトの場合は、純粋なオブジェクト指向のアプローチを使用してクラスを定義し、プロジェクト内でオブジェクトとクラスのみを使用する必要がある場合があります。プロジェクトが大きくなるほど、オブジェクト指向のアプローチを使用すると、保守が容易になり、理解しやすく、再利用しやすくなります。これがソフトウェアエンジニアリングの基本です。 Web サイトのデザインでこれらの概念を使用することが、将来の成功の鍵となります。
Advanced Object-Oriented Techniques in PHP
オブジェクト指向の基本概念を確認した後、より高度なテクニックをいくつか紹介します。
シリアル化
PHP は永続オブジェクトをサポートしていません。オブジェクト指向言語では、永続オブジェクトは、アプリケーションによって複数回呼び出された後もその状態と機能を保持するオブジェクトです。これは、オブジェクトをファイルまたはデータベースに保存する方法があることを意味します。そしてオブジェクトをリロードします。このメカニズムはシリアル化と呼ばれます。 PHP には、オブジェクトに対して呼び出すことができるシリアル化関数があり、オブジェクトを表す文字列を返します。次に、シリアル化関数は、メンバー関数の代わりにメンバー データを保存します。
PHP4 では、オブジェクトを文字列 $s にシリアル化し、そのオブジェクトを削除して、そのオブジェクトを $obj に逆シリアル化した場合でも、オブジェクトのメソッド関数を呼び出すことができます。ただし、(a) この機能は将来サポートされなくなる可能性があり、(b) シリアル化されたオブジェクトをディスクに保存してプログラムを終了するとファントムが発生するため、このアプローチはお勧めしません。シリアル化された文字列はメンバー関数を表さないため、このオブジェクトを逆シリアル化し、将来このスクリプトを再実行するときにオブジェクトのメソッドがまだ有効であることを期待することはできません。最後に、保存されたオブジェクトのメンバー変数をシリアル化することは、PHP では非常に便利です (連想配列と配列をディスクにシリアル化できます)。
例:
$obj=new Classfoo();
$str=serialize($obj);
// $str をディスクに保存
//...数か月後
// から str をロードdisk
$obj2=unserialize($str)
?>
上記の例では、メンバー関数なしでメンバー変数を復元できます(ドキュメントによると)。その結果、$obj2->x がメンバー変数にアクセスする唯一の方法になります (メンバー関数がないため)。
この問題を解決する方法は他にもいくつかありますが、このきれいな文書が台無しになるため、それはあなたに残します。
PHP が将来的にシリアル化を完全にサポートすることを願っています。
クラスを使用して保存データを操作する
PHP とオブジェクト指向プログラミングの優れた点の 1 つは、何かを操作するためのクラスを簡単に定義し、必要に応じて適切なクラスを呼び出すことができることです。 HTML ファイルがあり、ID 番号を選択して製品を選択する必要があるとします。データはデータベースに保存されており、価格などの製品情報を表示したいとします。さまざまな種類の製品があり、同じアクションでも製品ごとに異なる意味を持ちます。たとえば、サウンドの表示はその再生を意味しますが、他の製品ではデータベースに保存されている画像を表示することもあります。オブジェクト指向プログラミングと PHP を使用すると、より少ないコードで、より優れた方法で実行できます。
クラスを定義し、そのクラスが持つべきメソッドを定義し、継承によって各製品クラス(SoundItemクラス、ViewableItemクラスなど)を定義し、各製品クラスのメソッドを必要なものになるように再定義します。データベースに保存するテーブルの製品タイプ フィールドに基づいて、製品タイプごとにクラスを定義します。一般的な製品テーブルにはフィールド (ID、タイプ、価格、説明など) があります。スクリプトでは、データベース テーブルから型情報を取得し、対応するクラスのオブジェクトをインスタンス化します。
$obj=new $type();
$obj->action(); >
これは、オブジェクトの型を気にせずに、$obj の表示メソッドやその他のメソッドを呼び出すことができるという特徴です。この手法を使用すると、新しいタイプのオブジェクトを追加するときにスクリプトを変更する必要がありません。このメソッドは少し強力です。タイプに関係なくすべてのオブジェクトが持つ必要があるメソッドを定義し、それらをさまざまなクラスでさまざまな方法で実装することで、スクリプト内のさまざまなタイプのオブジェクトにメソッドを使用できます。 , 二人のプログラマーが同じファイルで満足することはありません。プログラミングがこんなに楽しいものだと思いますか?メンテナンスの負担が少なく、再利用可能ですか?
プログラマのグループを率いる場合、各人が特定のクラスとオブジェクトを担当できるようにタスクを分割するのが最善の方法です。国際化は、ユーザーが選択したさまざまな言語に適切なクラスを対応させるなど、同じ手法を使用して解決できます。
コピーとクローン
オブジェクト $obj を作成するとき、$obj2 = $obj を使用してオブジェクトをコピーできます。新しいオブジェクトは $obj のコピー (参照ではない) であるため、新しいオブジェクトは次と同じ値になります。割り当て後の $obj。場合によっては、これを望まず、単に obj と同じ新しいオブジェクトを作成し、new コマンドを使用したかのように新しいオブジェクトのコンストラクターを呼び出したい場合があります。これは、PHP のシリアル化と、他のクラスが継承する必要がある基本クラスを使用することによって実現できます。
危険なゾーンに入る
オブジェクトをシリアル化すると、特定の形式の文字列が得られます。興味がある場合は、その文字列の中にあるクラスの名前を解凍してみてください。
$herring = Serialize($obj);
$vec =explode(":",$herring);
$nam = str_replace(""", "", $vec[2]); ?>「宇宙」からすべてのクラスを継承すると、「宇宙」でクローンメソッドを定義できます->__clone();
?> 得られるのは、 new を使用しているかのように、クラスの新しいオブジェクトであり、コンストラクターが呼び出されます。これがうまくいくかどうかはわかりませんが、ユニバース クラスが継承元のクラスの名前を知っていることは良い習慣です。あなたに課せられるのはあなたの想像力だけです! ! !
注:私はPHP4を使用していますが、記事内のいくつかの内容はPHP3には適していない可能性があります。
-終わり-

上記では、オブジェクト指向 PHP におけるオブジェクト指向プログラミング、つまりオブジェクト指向の側面を含む大規模な PHP プロジェクトの方法について紹介しました。PHP チュートリアルに興味のある友人に役立つことを願っています。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。