この記事では、PHP のオブジェクト指向プログラミング (OOP) について紹介します。オブジェクト指向の概念を使用して、より少ないコードでより優れたプログラムを作成する方法を示します。皆さんの幸運を祈ります。
オブジェクト指向プログラミングの概念は、作成者ごとに異なる見解があります。オブジェクト指向言語が持つべきものを思い出させてください:
- データの抽象化と情報の隠蔽
- 継承
- ポリモーフィズム
PHP におけるクラスの使用方法カプセル化の場合:
class Something {
// OOP では、クラスは通常、大文字で始まります
var $x;
function setX($v) {
// メソッドは小文字で始まります。区切るには小文字を使用します
// メソッド名内の単語 EXAMPLE GETVALUEAREA () on getx () {
Return $ this- & gt
}
}
?> もちろん、独自のメソッドを使用することもできます。しかし、基準を持つことは常に良いことです。
PHPのクラスのデータメンバーは、値が割り当てられるまでは「var」を使用して定義されます。データ メンバーは、整数、配列、連想配列 (連想配列)、またはオブジェクトの場合があります。メソッドは、クラス内の関数として定義されます。メソッド内のデータ メンバーにアクセスするには、次のように $this->name を使用する必要があります。このメソッド、それ以外の場合は、メソッドの関数のローカル変数です。
new を使用してオブジェクトを作成します
$obj = new Something;
その後、メンバー関数
$obj->setX(5); を使用します
setX The member function assigns 5 to the member variable in the object (not the member) obj, and then getX returns the value 5.
また、オブジェクト参照を使用してメンバー変数にアクセスすることもできます。例: $obj->x =6; ただし、これはオブジェクト指向プログラミングにとって良いアプローチではありません。メンバー変数の値を設定するにはメンバー関数を使用し、メンバー変数を読み取るにはメンバー関数を使用することを強くお勧めします。メンバー関数を使用する以外はメンバー変数にアクセスできないと信じているなら、あなたは優れたオブジェクト指向プログラマーになれるでしょう。しかし残念ながら、PHP 自体には変数をプライベートとして宣言する方法がないため、不正なコードが存在することが許されています。
PHPにおける継承はextendを使って宣言します。
class Another extends Something {
var $y;
function setY($v) {
// メソッドは小文字で始まり、小文字で区切られます
// メソッド名の例 getValueOfArea() { このように、クラス「Another」のオブジェクトは、親クラスのプロパティ、使用されるメンバー変数とメソッド関数、さらに独自のメンバー変数とメンバー関数を持ちます。例:
$obj2=new Another;
$obj2->setX(6);
多重継承はサポートされていないため、1 つのクラスに複数のクラスを継承させることはできません。 。
継承されたクラスでは、メソッドを再定義するために再定義できます。「Another」で getX を再定義すると、同様に、継承されたクラスで同じメンバー変数を宣言すると、「Something」のメンバー関数 getX にアクセスできなくなります。名前を親クラスと同じ名前にすると、継承クラスの変数は親クラスと同じ名前の変数を非表示にします。
クラスのコンストラクターを定義できます。コンストラクターはクラスと同じ名前のメンバー関数で、クラスのオブジェクトを作成するときに呼び出されます。
class Something {
var $x;
function Something($y) {
$this->x=$y
}
function set X($v) {
$ this ->x=$v;
function getX() {
return $this->
コンストラクターは値 5 をメンバー変数 x に自動的に代入します。コンストラクター関数とメンバー関数は通常の 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
デフォルトのパラメータは C++ と同じように定義されているため、渡すことはできません値 Y を指定しますが、X にはデフォルト値を指定します。引数は左から右に渡され、引数がなくなると関数はデフォルトの引数を使用します。
継承クラスのコンストラクタが呼び出されたときのみ、継承クラスのオブジェクトが作成され、親クラスのコンストラクタは呼び出されないのがPHPの特徴です。コンストラクター呼び出しチェーンはオブジェクト指向プログラミングの専門分野です。基本クラスのコンストラクターを呼び出したい場合は、継承クラスのコンストラクターで明示的に呼び出す必要があります。これが機能するのは、親クラスのすべてのメソッドが継承されたクラスで使用できるためです。
function Another() {
$this->y=5;
$this->Something(); // 基本クラスのコンストラクターへの明示的な呼び出し
?>オブジェクト指向プログラミングの優れたメカニズムは、抽象クラスを使用することです。抽象クラスはインスタンス化できませんが、継承されたクラスのインターフェイスを定義するために使用されます。デザイナーは、プログラマに特定の基本クラスからのみ継承させるために抽象クラスをよく使用します。これにより、新しいクラスが必要な機能を備えていることを確認できますが、PHP にはこれを行う標準的な方法はありません。これは、コンストラクターで「die」を呼び出すことで基本クラスを定義するときに必要になります。これにより、抽象クラスの関数を定義し、各関数で「die」を呼び出すことができます。クラス内のプログラマが再定義を行わずに基底クラスの関数を直接呼び出すと、エラーが発生します。さらに、PHP には型がないため、一部のオブジェクトは基本クラスから継承する継承クラスから作成されることを確認する必要があります。そのため、クラスを識別するメソッド (「何らかの識別子」を返す) を基本クラスに追加し、これを検証します。受け取ったときにオブジェクトにパラメータとして渡すと便利です。しかし、不正なプログラムに対する解決策はありません。不正なプログラムは継承されたクラスでこの関数を再定義できるため、通常、この方法は怠惰なプログラマにしか機能しません。もちろん、最善の方法は、プログラムが基本クラスのコードに触れないようにして、インターフェイスのみを提供することです。
PHPではオーバーロードはサポートされていません。オブジェクト指向プログラミングでは、異なるパラメーターの型と数値を定義することによって、同じ名前のメンバー関数をオーバーロードできます。 PHP は型付けが緩い言語であるため、パラメーターの型のオーバーロードは役に立ちません。同様に、異なる数のパラメーターを使用したオーバーロードも機能しません。
オブジェクト指向プログラミングでは、コンストラクターをオーバーロードすると、さまざまな方法で (さまざまな数のパラメーターを渡すことで) さまざまなオブジェクトを作成できるようになり、便利な場合があります。ちょっとしたトリックでこれを行うことができます:
class Myclass {
function Myclass() {
$this->$name();
/ /Note $this->$name() は通常間違っていますが、ここでは
//$name は呼び出すメソッドの名前を含む文字列です
}
function Myclass1($x) {
}
Function Myclass2($x,$y) {
Code;
}
}
?>
このメソッドを通じて、オーバーロードの目的を部分的に達成できます。
$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 をディスクに保存
//...数か月後
/ /Load str from disc
$obj2=unserialize($str)
?>
上記の例では、メンバー関数なしでメンバー変数を復元できます(ドキュメントによると)。その結果、$obj2->x がメンバー変数にアクセスする唯一の方法になります (メンバー関数がないため)。
この問題を解決する方法は他にもいくつかありますが、このきれいな文書が台無しになるため、それはあなたに残します。
PHP が将来的にシリアル化を完全にサポートすることを願っています。
クラスを使用して保存データを操作する
PHP とオブジェクト指向プログラミングの優れた点の 1 つは、何かを操作するためのクラスを簡単に定義し、必要に応じて適切なクラスを呼び出すことができることです。 HTML ファイルがあり、製品の ID 番号を選択して製品を選択する必要があるとします。データはデータベースに保存されており、価格などの製品情報を表示したいとします。さまざまな種類の製品があり、同じアクションでも製品ごとに異なる意味を持ちます。たとえば、サウンドの表示はその再生を意味しますが、他の製品ではデータベースに保存されている画像を表示することもあります。オブジェクト指向プログラミングと PHP を使用すると、より少ないコードで、より優れた方法で実行できます。
クラスを定義し、そのクラスが持つべきメソッドを定義し、継承によって各プロダクトクラス(SoundItemクラス、ViewableItemクラスなど)を定義し、各プロダクトクラスのメソッドを必要なものに再定義します。データベースに保存するテーブルの製品タイプ フィールドに基づいて、製品タイプごとにクラスを定義します。一般的な製品テーブルにはフィールド (ID、タイプ、価格、説明など) があります。スクリプトでは、データベース テーブルから型情報を取得し、対応するクラスのオブジェクトをインスタンス化します。
$obj=new $type();
?> ;
これは、オブジェクトの型を気にせずに、$obj の表示メソッドやその他のメソッドを呼び出すことができるという特徴です。この手法を使用すると、新しいタイプのオブジェクトを追加するときにスクリプトを変更する必要がありません。このメソッドは少し強力です。タイプに関係なくすべてのオブジェクトが持つ必要があるメソッドを定義し、それらをさまざまなクラスでさまざまな方法で実装することで、スクリプト内のさまざまなタイプのオブジェクトにメソッドを使用できます。 , 二人のプログラマーが同じファイルで満足することはありません。プログラミングがこんなに楽しいものだと思いますか?メンテナンスの負担が少なく、再利用可能ですか?
プログラマのグループを率いる場合、各人が特定のクラスとオブジェクトを担当できるようにタスクを分割するのが最善の方法です。国際化は、ユーザーが選択したさまざまな言語に適切なクラスを対応させるなど、同じ手法を使用して解決できます。
コピーとクローン
オブジェクト $obj を作成するとき、$obj2 = $obj を使用してオブジェクトをコピーできます。新しいオブジェクトは $obj のコピー (参照ではない) であるため、代入後は新しいオブジェクトがコピーされます。 object has $obj は新しい状態と同じです。場合によっては、これを望まず、単に obj と同じ新しいオブジェクトを作成し、new コマンドを使用したかのように新しいオブジェクトのコンストラクターを呼び出したい場合があります。これは、PHP のシリアル化と、他のクラスが継承する必要がある基本クラスを使用することによって実現できます。
危険ゾーンへの突入
オブジェクトをシリアル化すると、特定の形式の文字列が得られます。興味がある場合は、文字列内の 1 つの要素を解凍してみてください。 :
$herring = Serialize($obj);
$vec =explode(":",$herring);
$nam = str_replace(""", "" , $vec[2]) ;
?>
クラス「Universe」を作成し、すべてのクラスを「Universe」から継承させると、「Universe」に clone メソッドを定義できます:
< ;?php
class Universe {
function __clone( ) {
$herring=serialize($this);
$vec=explode(":",$herring);
$nam=str_replace(""", "", $vec[2]);
バース!!
$ other=$obj->__clone();
?>
取得するものは、 new を使用するのと同じように、コンストラクターが呼び出されます。これがうまくいくかどうかはわかりませんが、ユニバース クラスが継承元のクラスの名前を知っていることは良い習慣です。あなたに課せられるのはあなたの想像力だけです! ! !
注: 私は PHP4 を使用しています。記事内の一部の内容は PHP3 には適していない可能性があります。
-終わり-