このパートには次の技術的なポイントが含まれます:
1. オブジェクト指向の概念
2. クラスとは、オブジェクトとは、クラスとオブジェクトの関係
3. オブジェクト指向とはプログラミング?
4. クラスを抽象化するにはどうすればよいですか?
5. オブジェクトをインスタンス化するにはどうすればよいですか?
6. オブジェクト内でメンバーを使用するにはどうすればよいですか?
7. 特殊参照「$this」の使用
8. 構築方法と破棄方法
9. カプセル化
10. __set()、__get()、__isset()、__unset() メソッドの適用
11. クラスの継承
12. ポリモーフィズムの適用
13. 新しいメソッドのオーバーロード
14. アクセス型
15. 静的メンバーの使用
16. 最終キーワードの適用 _ _ 17.__ Tostring ()メソッド
18. Calone オブジェクト19.__ 処理エラーの呼び出し
21. オブジェクトのシリアル化を回す
22. 抽象メソッドと抽象クラス23
23 .php5 インターフェース技術1.オブジェクト指向の概念
オブジェクト指向プログラミング (オブジェクト指向プログラミング、OOP、オブジェクト指向プログラミング) は、コンピューター プログラミング アーキテクチャです。OOP の基本原理は、コンピューター プログラムが単一のユニットまたはユニットで構成されることです。 OOP はサブルーチンとして機能するオブジェクトを使用して、再利用性、柔軟性、拡張性というソフトウェア エンジニアリングの 3 つの目標を達成します。全体的な操作を実現するために、各オブジェクトは情報を受信し、データを処理し、他のオブジェクトに情報を送信できます。オブジェクト指向はソフトウェア開発の分野で常に注目されています。まず第一に、オブジェクト指向は人間の物の見方の一般的なルールと一致しています。第二に、オブジェクト指向の手法を使用することで、システムの各部分がそれぞれの役割を果たし、任務を遂行できるようになります。これにより、プログラマーは、よりシンプルで保守が容易で再利用可能なコードを作成できるようになります。 PHP は真のオブジェクト指向言語ではないという人もいますが、これは本当です。 PHP はハイブリッド言語であり、OOP または従来の手続き型プログラミングを使用できます。ただし、大規模なプロジェクトの場合は、純粋な OOP を使用して PHP でクラスを宣言し、プロジェクト内のオブジェクトとクラスのみを使用する必要がある場合があります。この概念については詳しく説明しません。多くの友人がオブジェクト指向プログラミングから遠ざかる主な理由は、オブジェクト指向の概念に触れても理解できないためです。それを学びたいです。全体的な内容を読んだ後、読者にコンセプトを理解してもらいます。
2. クラスとは何か、オブジェクトとは何か、そしてクラスとオブジェクトの関係
クラスの概念: クラスは、同じ属性とサービスを持つオブジェクトのコレクションです。これは、このクラスに属するすべてのオブジェクトに対して統一された抽象的な説明を提供します。これには、プロパティとサービスという 2 つの主要な部分が含まれます。オブジェクト指向プログラミング言語では、クラスは独立したプログラム単位であり、クラス名を持ち、属性の説明とサービスの説明という 2 つの主要な部分を含む必要があります。
オブジェクトの概念: オブジェクトは、システム内の客観的なものを記述するために使用される実体であり、システムを構成する基本単位です。オブジェクトは、プロパティのセットと、プロパティのセットに対して動作するサービスのセットで構成されます。より抽象的な観点から見ると、オブジェクトは、問題ドメインまたは実装ドメイン内の何かを抽象化したもので、そのオブジェクトが保存する必要がある情報と、オブジェクトがシステム内で果たす役割とを反映しています。これらの属性は、操作を実行する一連のサービスのカプセル化によって制御されます。客観的な世界は、オブジェクトとオブジェクト間の接続で構成されます。
クラスとオブジェクトの関係は、型と鋳造の関係に似ています。クラスのインスタンス化の結果がオブジェクトであり、オブジェクトの型を抽象化したものがクラスです。クラスは、同じ特性 (プロパティ) と同じ動作 (メソッド) を持つオブジェクトのグループを記述します。 🎜
上記はおそらくオブジェクト指向の定義です。中関村に行って組み立て済みの PC を購入したい場合に、その概念に混乱しないでください。最初のステップは何ですか? 設置エンジニアがあなたと一緒に座って、あなたが提供した情報に基づいて設置設定シートを作成しますか? この設定シートは単なる紙に過ぎません。この構成リストを使用して 10 台のマシンを購入すると、これらの 10 台のマシンはすべてこの構成リストに従って構成されるため、これらの 10 台のマシンは同じ種類であると言えます。同じタイプであること。では、オブジェクトとは何でしょうか? この構成シートを使用して構成 (インスタンス化) されたマシンはオブジェクトであり、10 台のマシン、10 個のオブジェクトを操作できます。各マシンは独立しています。これは、マシンの 1 つで実行されたアクションは他の 9 台のマシンには影響しません。つまり、この構成リストに 1 つ以下を追加することを意味します。アクセサリの場合、インストールされている 9 台のマシンがすべて変更されます。これは、クラスとオブジェクトの関係です (クラスのインスタンス化の結果はオブジェクトです)。
3. オブジェクト指向プログラミングとは何ですか?
彼のコンセプトは言うまでもありませんが、コンピューター教室を建てたい場合は、まず N 台のコンピューター、N 個のテーブル、N 個の椅子、ホワイトボード、プロジェクターなどを備えた部屋を用意する必要があります。これらは何ですか、先ほど言いました、これらはこのコンピュータ教室の単位は、これらのエンティティ オブジェクトであると言えます。つまり、私たちはプログラムを実行していますが、それはオブジェクト指向と何の関係があるのでしょうか。システム プログラムの開発は、コンピュータ教室を構築することに似ています。システムは、情報を受信し、データを処理し、他のオブジェクトにデータを送信することができる、複数のオブジェクトで構成されます。などのやり取りが行われます。オブジェクト指向プログラムを構成します。
4. クラスを抽象化するには?
上で述べたように、オブジェクト指向プログラムの単位はオブジェクトですが、オブジェクトはクラスによってインスタンス化されるため、最初に行う必要があるのはクラスを宣言する方法です。基本的なプログラムの構文定義ルールはマスターすれば作れるのですが、何が難しいのでしょうか?プロジェクトで使用するクラスとオブジェクトの数、クラスを定義する場所、定義するクラスの種類、このクラスによってインスタンス化されるオブジェクトの数、クラス内に属性がいくつあるか、メソッドがいくつあるか、これには、読者が実際の開発における実際的な問題を分析、設計、要約することが必要です。
クラスの定義:
class クラス名 {
}
キーワード class の後に必要なクラス名と中括弧のペアを使用して、クラスの構造を定義します。その中にコードを記述するだけです。 、でもそこには何を書けばいいのでしょうか? 何を書けばいいでしょうか?完全なクラスを作成するにはどうすればよいですか?前述したように、クラスを使用する目的は、使用するオブジェクトをインスタンス化することです。これには、前述のインストール構成シートと同様に、マシンに何が書かれているかを知る必要があります。すべて。たとえば、人は単なるターゲットです。自分の好きな人をどのようにリーダーに推薦しますか。もちろん、詳細であればあるほど良いです:
まず、その人の名前、性別、年齢、身長、体重、電話番号、自宅の住所などを紹介します。
次に、この人は何ができるか、運転ができるか、英語を話せるか、コンピューターが使えるかなどを紹介しなければなりません。
あなたがより多くを紹介すれば、他の人はその人についてもっと知ることができます。 ここで私たちが人を説明する方法を要約しましょう
説明からわかるように、クラスの作成は、定義の観点から 2 つの部分に分かれています。1 つ目は静的記述であり、2 つ目は、上で見たように
属性と呼ばれるものです。氏名、性別、年齢、身長、体重、電話番号、自宅住所など動的に言うと、それは人間のオブジェクトの機能です。たとえば、この人は車を運転することができ、英語を話し、コンピューターを使用することができます。動的をプログラムに抽象化すると、関数やメソッドになります。同じ。したがって、すべてのクラスは属性とメソッドという観点から記述されます。属性はこのクラスのメンバー属性とも呼ばれ、メソッドはこのクラスのメンバー メソッドとも呼ばれます。
クラス人物 {
メンバー属性: 名前、性別、年齢、身長、体重、電話番号、自宅住所
メンバーメソッド: 車の運転ができる、英語を話せる、コンピューターを使用できる
}
属性:
クラス定義でキーワード「var」を使用して変数を宣言すると、クラスの属性が作成されますが、宣言時にメンバー属性 クラス宣言時に初期値を与えることができますが、クラス宣言時にメンバー属性に初期値を与える必要はありません。たとえば、人の名前を「Zhang San」に割り当てる場合はこれを使用します。この数十人の名前は Zhang San であるため、インスタンスからオブジェクトを作成した後でメンバー属性の初期値を指定するだけで済みます。
例: var $somevar;
メソッド (メンバー関数):
クラス定義で関数を宣言することで、クラスのメソッドが作成されます。
例: function somefun (パラメータリスト)
{ ... ... }
class person
{
// 以下は person
のメンバー属性ですvar $ name ; // その人の名前
var $ sex ; // その人の性別
var $ age 話し方
{
echo "この人は話しています" ;関数実行( ) // この人が歩く方法
{
echo "この人は歩いています" ;
}
?> という観点で宣言されたクラスです。属性とメソッドを定義しますが、メンバーの属性を宣言するのが最善です
今回行うため、初期値は与えないでください。 クラスは、将来オブジェクトをインスタンス化するために使用できる記述情報です。たとえば、人間のオブジェクトが 10 個ある場合。がインスタンス化されると、これら 10 人はそれぞれ異なる名前、性別、年齢を持つことになるため、この場所ではメンバー属性には初期値が割り当てられますが、値は各オブジェクトに個別に割り当てられます。
属性とメソッドを使用してエンティティを記述できる限り、同じメソッドを使用して、それらをクラスとして定義し、オブジェクトをインスタンス化できます。
クラスの理解を強化するために、形状の範囲をもう少し広げて、長方形を作成してみましょう。属性は?長方形の機能は何ですか?
class Rectangle
{
//長方形のプロパティ
長方形の長さ;
長方形の幅;
// 長方形のメソッド
Peri長方形の長さのメートル
の面積四角形;
}
クラス Rect
{
var $ kuan
var $ gao ;
{
長方形の周囲長を計算します;
}
function mianJi()
{
長方形の面積を計算する
}
?>複数の長方形オブジェクトを作成し、それぞれの長方形をオブジェクトには独自の長さと幅があるため、周囲と面積を見つけることができます。
クラス宣言はここで終わりにしましょう! !
5. オブジェクトをインスタンス化する方法
オブジェクト指向プログラミングの単位はオブジェクトであると上で述べましたが、クラスは宣言されるので、次のステップはオブジェクトをインスタンス化することです。物体。 。
クラスを定義した後、new キーワードを使用してオブジェクトを生成します。
$ Object name = new Class name();
class person
{
// 以下は person
のメンバー属性ですvar $ name ; // その人の名前
var $ sex ; // その人の性別
var $ age ) // この人の話し方
{
echo "この人は話しています" ;
} function run() p2 = new Person();
$ p3 = new Person();
; このコードは、クラスを通じてインスタンス オブジェクトを生成するプロセスです。同様に、$p2 と $p3 もインスタンス化するオブジェクトの名前です。上記のコードは 3 人のインスタンスに相当します。一人一人が人間であるということだけでなく、それぞれの名前や性別、年齢という属性も、メンバーの属性やメンバーであれば誰しもが持つものである。メソッドがクラスに反映されると、インスタンス化されたオブジェクトにはこれらの属性とメソッドが含まれます。
PHP の整数型や浮動小数点型と同様に、オブジェクトもデータ クラスです。これらは、操作中に使用するためにメモリにロードされる必要があります。その後、メモリ内のオブジェクトはどのように反映されますか。 ?論理的に言えば、メモリはスタック領域セグメント、ヒープ領域セグメント、コードセグメント、初期化静的セグメントの 4 つのセグメントに大別され、プログラム内の異なる宣言は異なるメモリ セグメントに配置され、スタック領域セグメントは同じ領域を占有します。整数 1、10、100、1000、10000、100000 など、長さが短くスペースを占有するデータ型は、メモリ内で同じ長さのスペースを占有し、すべて 64 ビットと 4 バイトです。 では、データ長が可変で多くのスペースを占めるデータ型のデータは、そのメモリセグメントのどこに配置すればよいのでしょうか?このようなデータはヒープ メモリに配置されます。スタック メモリには直接アクセスできますが、ヒープ メモリには直接アクセスできません。このオブジェクトの場合、それは大きなデータ型であり、可変長の領域を占有するため、オブジェクトはヒープに配置されますが、オブジェクト名はスタックに配置されるため、オブジェクトを介して使用できます。名前。 。
$p1=new Person();
このコードでは、$p1 はスタック メモリ内のオブジェクト名であり、new Person() はヒープ メモリ内の実際のオブジェクトです。詳細については、以下の図を参照してください。
上の図からわかるように、$p1=new Person(); 等号の右側は実際のオブジェクト インスタンス、つまりヒープ メモリ内のエンティティです。上の図では () なので、3 つのスペースが 3 つのインスタンス オブジェクトを生成します。PHP では、新しいキーワードが出現する限り、オブジェクトは独自のスペースを使用します。インスタンス化され、ヒープ内で開かれます。
ヒープ内の各インスタンス オブジェクトは属性を保存します。たとえば、ヒープ内のインスタンス オブジェクトには名前、性別、年齢が保存されます。各属性にはアドレスがあります。
$p1=new Person(); 等号 $p1 の右側は参照変数です。代入演算子 "=" によってオブジェクトの最初のアドレスが参照変数 "$p1" に代入されます。 p1 は、格納されたオブジェクトの最初のアドレスです。アドレス変数 $p1 は、ヒープ内のオブジェクトを指すポインターに相当するため、参照変数 $ を通じてオブジェクトを操作できます。 p1. 通常、オブジェクト参照のことをオブジェクトとも呼びます。
6. オブジェクト内のメンバーの使用方法
上で見たように、PHP オブジェクトには 2 種類のメンバーがあり、1 つは member 属性、もう 1 つは member メソッドです。すでにオブジェクト
を宣言できます。 オブジェクトのメンバーを使用するにはどうすればよいですか?オブジェクト内のメンバーにアクセスする場合は、特別な演算子「->」を使用してオブジェクト メンバーへのアクセスを完了する必要があります:
->セックス
メソッド $p1->say(); 下は人間の属性
; ;
}
function run() // この人の歩き方
{
echo "この人はここにいます 歩いています"
}
}
$ p1 = new Person();インスタンス オブジェクトの作成 $p1
$ p2 = new Person(); // インスタンス オブジェクトの作成 $p2
$ p3 = new Person () // インスタンス オブジェクトの作成 $p3
// 以下の 3 行は$p1 オブジェクトのプロパティに値を代入します
$ p1 ->name= ” Zhang San”
$ p1 ->sex= ” Male”
$ p1 ->age=
;
// 次の 3 行は $p1 オブジェクトのプロパティにアクセスするためのものですecho " p1 オブジェクトの名前は次のとおりです: " . $ p1 ->name. "
// 次の 2 行は $p1 オブジェクトのメソッドにアクセスします
$ p1 ->say();
$ p1 ->run(); // 以下の 3 行です$p2 オブジェクト属性
$ p2 ->name= ” 李思”
$ p2 ->sex= ” Female”
$ p2 ->age=
;// 以下の 3 行は $p2 オブジェクトの属性にアクセスするためのものです
echo "p2 オブジェクトの名前は次のとおりです。 $ p2 ->name. "echo “ p2 オブジェクトの年齢は次のとおりです: ” . $ p2 ->age. ”
// 次の 2 行は $p2 オブジェクトメソッドにアクセスします
$ p2 ->say();
// 次の 3 行は値を代入します$p3 オブジェクトのプロパティに
$ p3 ->name= ” Wang Wu ”
$ p3 ->sex= ” 男性”
/ / 次の 3 行は、$p3 オブジェクトのプロパティにアクセスします
echo " p3 オブジェクトの名前は次のとおりです。 $ p3 ->name. "
オブジェクトの年齢は次のとおりです。 ;
// 次の 2 行は $p3 オブジェクトのメソッドにアクセスします
$ p3 ->say();
?>上記の例から、オブジェクト内のメンバーのみが object-> 属性、 object-> メソッド フォームを使用してアクセスする必要があることがわかります。
7. 特別な参照「$this」の使用
これで、「オブジェクト -> メンバー」を介してオブジェクト内のメンバーにアクセスする方法がわかりました。これは、オブジェクトの内部に入りたい場合は、「いつ行うべきか」を考えてみましょう。オブジェクト内のメソッドがこのオブジェクトのプロパティにアクセスしますか、それともオブジェクト内のメソッドがこのオブジェクトの他のメソッドを呼び出しますか?オブジェクト内のすべてのメンバーは、オブジェクトの内部メンバー間の呼び出しを含め、オブジェクトを使用して呼び出される必要があるため、PHP はこのオブジェクトへの参照 $this を提供し、各オブジェクトにはこのオブジェクトへの参照が含まれます。これでオブジェクトの内部メンバーへの呼び出しが完了します。this の本来の意味は「this」です。上記の例では、3 つのインスタンス オブジェクト $P1、$P2、および $P3 が 1 つ存在します。これはそれぞれオブジェクト $p1、$p2、および $p3 を表します。
上の図からわかるように、$this はオブジェクト内のオブジェクトを表す参照です。オブジェクト内でこのオブジェクトのメンバーを呼び出すために使用されるメソッドは、オブジェクトの外部でオブジェクトのメンバーを呼び出すのと同じです。物体。
$this->名前; $this->性別;
$this->say(); ;run(); 上記の例を変更して、全員に自分の名前、性別、年齢を教えてもらいます:
{
// 以下は person
var のメンバー属性です。 $ name ; // その人の名前
var $ sex ; // その人の性別
var $ age ; / この人の話し方
echo " 私の名前は: " . >name. " 性別: " . $ this ->age. "
関数 run() ; person can walk
{
echo "この人は歩いています" ;
}
}
$ p1 = new Person(); // インスタンス オブジェクトを作成 $p1
$ p2 = new Person(); // インスタンス オブジェクトを作成します $p2
$ p3 = new Person(); // インスタンス オブジェクトを作成します $p3
// 次の 3 行は、$p1 オブジェクトの属性に値を割り当てます
$ p1 -> ;name= "张三" ;
$ p1 ->sex= "男" ; $ p1 ->
// 次に、$p1 オブジェクトの発話メソッドにアクセスします
p1 ->say();// 次の 3 行は $p2 オブジェクト属性に値を代入するためのものです
$ p2 ->name = "李思" ; $ p2 ->sex = "女性" ;
$ p2 ->age= 30 ; // 次に、$p2 オブジェクトの発言メソッドにアクセスします
$ p2 ->
// 以下の 3 行$p3 オブジェクト属性に値を割り当てることです
$ p3 ->name= "王五" ;
$ p3 ->sex= " Male" ; $ p3 - >age= 40 ;
// 次に $p3 オブジェクトの speech メソッドにアクセスします
$ p3 ->say();
?>
私の名前: Zhang Three 性別: 男性 私の年齢現在: 20 歳
私の名前: Li Si 性別: 女性 私の年齢: 30私の名前: Wang Wu 性別: 男性 私の年齢: 40
分析してください このメソッド:
functionsay() // メソッドこの人が話すことができるのは
{
echo " 私の名前は: " . $ this -> 性別: " . $ this -> です。 「
$p1、$p2、$p3 の 3 つのオブジェクトに Say() メソッドがあり、$this はそれぞれ対応するプロパティを呼び出し、そのプロパティの値を出力します。属性メソッドでは、say() メソッド内で run() メソッドを呼び出した場合、say() メソッド内で $this->run() メソッドを使用して呼び出しを完了することもできます。
8. コンストラクターとデストラクター
ほとんどのクラスには、コンストラクターと呼ばれる特別なメソッドがあります。オブジェクトが作成されると、自動的にコンストラクターが呼び出されます。つまり、 new キーワードを使用してオブジェクトをインスタンス化すると、コンストラクターが自動的に呼び出されます。
コンストラクターの宣言は、その名前が __construct() でなければならないことを除いて、他の操作の宣言と同じです。これは PHP5 での変更です。以前のバージョンでは、コンストラクターの名前はクラス名と同じである必要がありました。これは PHP5 でも引き続き使用できますが、この利点は、コンストラクターをクラス名と同じにすることができることです。クラス名に関係なく、クラス名が変更された場合でも、対応するコンストラクター名を変更する必要はありません。下位互換性のために、クラスに __construct() という名前のメソッドがない場合、PHP はクラス名と同じ名前で php4 で記述されたコンストラクター メソッドを検索します。
形式: function __construct ([parameter]) { ... ... }
クラス内で宣言できるコンストラクターは 1 つだけですが、そのコンストラクターはオブジェクトが作成されるたびに 1 回だけ呼び出されます。はアクティブに呼び出されるため、通常はいくつかの便利な初期化タスクを実行するために使用されます。たとえば、オブジェクトの作成時に、対応するプロパティに初期値が割り当てられます。
<
// 人間
クラスを作成します{
// 以下は人物のメンバー属性です
var $ name ; // 性別
var $ age ; person
// コンストラクターのパラメーターを名前 $name、性別 $sex 、年齢 $age として定義します
function __construct( $ name , $ sex , $ age )
{
// コンストラクターを通じて渡される $nameメンバー属性 $this->name に初期値が割り当てられます
$ this ->name= $ name
// コンストラクターを通じて渡された $sex メンバー属性 $this- に初期値を割り当てます>sex
$ this ->sex= $ sex ;
// コンストラクター メソッドを通じて渡された $age は、メンバー属性 $this->age に初期値を割り当てます
$ this ->age = $ 年齢 ;
}
// この人の話し方
function Say()
{
echo " 私の名前は: " . $ this -> ;sex. " 私の年齢は: " . $ this ->age. "
}
// それぞれを渡すコンストラクターによって作成されます。 3 つの異なる実際のパラメータ: 名前、性別、年齢
$ p1 = new Person("张三", " Male", 20)
$ p2 = new Person("李四"," Female", 30);
$ p3 = new Person("王五","男", 40);
// 次に、$p1 オブジェクトの発話メソッドにアクセスします
$ p1 ->say(); // 次へ, $p2 オブジェクトの発話メソッドにアクセスします
$ p2 ->say(); // 次に、$p3 オブジェクトの発話メソッドにアクセスします
$ p3 ->say(); >
出力結果は次のとおりです:
私の名前: Zhang San 性別: 男性 私の年齢: 20
私の名前: Li Si 性別: 女性 私の年齢: 30
私の名前: Wang Wu 性別: 男性私の年齢は40歳ですコンストラクターの反対はデストラクターです。デストラクターは PHP5 で新しく追加されたものです。PHP4 にはデストラクターはありません。デストラクターを使用すると、クラスを破棄する前に、ファイルを閉じる、結果セットを解放するなど、一部の操作を実行したり、一部の機能を完了したりできます。デストラクターは、オブジェクトへのすべての参照が削除されるか、オブジェクトが明示的に破棄されるときに削除されます。オブジェクトがメモリ内で破棄されるときに実行されます。つまり、デストラクタは、オブジェクトがメモリ内で破棄される前に呼び出されます。 コンストラクターの名前と同様に、クラスのデストラクターの名前は __destruct() でなければなりません。デストラクターはパラメータを取ることができません。
書式:function __destruct ( ) { ... ... }
// 人間
class を作成する
{
// 以下は人物
のメンバー属性ですvar $ name ; // 人の名前var $ sex ; // 人の性別
// コンストラクタパラメータを name $name、性別 $sex および age $ として定義しますage
function __construct( $ name , $ sex , $ age )
{
// コンストラクター メソッドを通じて渡された $name は、メンバー属性 $this->name
$ に初期値を割り当てますthis -> ;name= $ name
// コンストラクターを通じて渡された $sex には、メンバー属性 $this->sex
$ this ->sex= $ sex ; // コンストラクターを通じて、渡された $age はメンバー属性に初期値を割り当てます $this->age
$ this ->age= $ age }
// この人の話し方
関数Say()
{
echo " 私の名前は: " . $ this -> 性別: " . $ this -> 年齢。 < br>" ;
}
// これはオブジェクトが破棄される前に呼び出されるデストラクターです
function __destruct()
{
echo "Goodbye" . $ this ->name. " < br> ; ” ;
}
// コンストラクター メソッドを通じて 3 つのオブジェクト $p1、p2、$p3 を作成し、それぞれ名前、性別、年齢の 3 つの異なる実際のパラメーターを渡します
$ p1 = new person( "張三", "男性", 20);
$ p2 = 新しい人("李四", "女性", 30);
$ p3 = 新しい人("王五", "男性", 40 ) ;
// 次に、$p1 オブジェクトの発話メソッドにアクセスします
$ p1 ->say();
// 次に、$p2 オブジェクトの発話メソッドにアクセスします
$ p2 ->say ();
// 次に、$p3 オブジェクトの発話メソッドにアクセスします
$ p3 ->say();
?> 出力結果は次のとおりです:
私の名前: Zhang San 性別:男性 鉱山 年齢: 20
私の名前: Li Si 性別: 女性 私の年齢: 30
私の名前: Wang Wu 性別: 男性 私の年齢: 40さようなら、張三
さようなら、李思
、さようなら、王Wu
9. カプセル化
カプセル化は、オブジェクト指向プログラミングの 3 つの主要な特徴の 1 つであり、オブジェクトのプロパティとサービスを独立した同一のユニットに結合し、可能な限り見えないようにすることです。オブジェクトの内部詳細には、次の 2 つの意味が含まれます。 1. オブジェクトのすべてのプロパティとサービスを組み合わせて、分割不可能な独立した単位 (つまり、オブジェクト) を形成する。 2. 情報の隠蔽、つまり物体の内部の詳細を可能な限り隠し、外界との境界を形成(または障壁を形成)し、外部と接続するための限られた外部インターフェースのみを保持する。
ソフトウェアにおけるカプセル化の原理の反映は、オブジェクト以外の部分がオブジェクトの内部データ (プロパティ) に自由にアクセスできないことを要求し、それによって外部エラーの「相互感染」を効果的に回避し、ソフトウェア エラーを可能にすることです。ローカライズされるため、エラー検出とトラブルシューティングの難しさが大幅に軽減されます。 "あなたはそれを手に入れることができますが、あなたがそれをパッケージ化するなら
その後、あなた自身がそれを伝えない限り、他の人はカプセル化された属性を取得する方法がなくなります。
別の例として、すべてのパソコンにはパスワードがあり、他人が勝手にログインしたり、それをコピーして自分のコンピュータに貼り付けたりすることは望ましくありません。また、人間のような物体において、身長や年齢という属性は自分自身でのみ増加させることができ、他人が恣意的に値を割り当てることはできません。
private キーワードを使用してプロパティとメソッドをカプセル化します:
元のメンバー:
var $age ;
private $sex; // プライベート キーワードを使用して個人の性別をカプセル化します。 $age; of ウォーキング メソッドは、private キーワードを使用してカプセル化されます注: メンバー属性の前に他のキーワードがある限り、元のキーワード「var」を削除する必要があります。
プライベートを通じて、人間のメンバー (メンバー プロパティとメンバー メソッド) をカプセル化できます。カプセル化されたメンバーにはクラスの外部から直接アクセスすることはできず、オブジェクト自体内でのみアクセスできます。次のコードではエラーが生成されます。 // 人の名前は、private
private $ sex ; // 人の性別は、private
private $ age でカプセル化されます。 // 人の年齢は、private
によってカプセル化されます。 // この人の話し方
function Say()
{
echo " 私の名前は: " . $this ->name. " 性別: " . $ this -> 年齢: " . . "
;
}
// この人が歩くメソッドは private
プライベート関数 run()echo "この人は歩いています" ;
}
// 人のインスタンスオブジェクトをインスタンス化します
$ p1 = new Person();
// プライベート属性に値を割り当てようとするとエラーが発生します
$ p1 ->name= "张三" ;
$ p1 ->sex= "男" ;
$ p1 ->age= 20 ;
// プライベート属性を出力しようとすると、結果エラーが発生します
echo $ p1 - >名前。 ''
echo $ p1 -> '' //プライベート メンバー メソッドを出力すると、エラーが発生します
$ p1 ->run();
出力結果は次のとおりです:
致命的なエラー
: プライベート プロパティにアクセスできません:: $name
致命的なエラー
:私有地にアクセスできません person::$sex致命的エラー: プライベート プロパティ Person::$age にアクセスできません
致命的エラー: プライベート プロパティ Person::$name にアクセスできません
致命的エラー: コンテキストからプライベート メソッド Person::run() を呼び出します''
上の例からわかるように、プライベート メンバーはこのオブジェクト内でのみアクセスできるため、外部からアクセスすることはできません。たとえば、$p1 オブジェクトはそのプライベート属性を共有したいと考えています。 Say() メソッドのプライベート プロパティ。 (アクセス制御は追加されません。デフォルトはパブリックであり、どこからでもアクセスできます)
// この人は自分のプライベート属性を伝える方法で話すことができます
function Say()
{
echo " 私の名前は: " . $ this -> 性別: " . $ this -> 年齢。" ;
// ここでプライベート メソッドにアクセスすることもできます
//$this->run();
}
メンバー メソッドsay() は public であるため、say( ) メソッドを外部で変更するには、上記のコードを変更します。
class person
{
// 以下は人物のメンバー属性です
private $ name // 人物の名前は private On によってカプセル化されます
private $ sex ; $name、性別 $sex 、年齢 $age が割り当てられます
function __construct( $ name , $ sex , $ age )
{
// コンストラクターメソッドを通じて渡された $name が割り当てられます$this-> name には初期値が割り当てられます
$ this ->name= $name
// コンストラクターを通じて渡された $sex はプライベート メンバー プロパティに初期値が割り当てられます$this->sex
$ this -> sex= $ sex
// コンストラクターを通じて渡された $age には、プライベートメンバープロパティ $this->age
$ this ->age= $ age
}
// この人はメソッドと会話でき、自分のプライベート プロパティを発言でき、ここでプライベート メソッドにアクセスすることもできます
function Say()
{
echo " 私の名前: " . $ this -> 性別: " . $ this ->
;}
// コンストラクターメソッドを通じて 3 つのオブジェクトを作成 $p1、p2、$p3 それぞれに、名前、性別、年齢の 3 つの異なる実パラメータを渡します
$ p1 = new Person("张三", " Male ", 20);
$ p2 = 新しい人 ("李思", "女", 30);
$ p3 = 新しい人("王五", "男", 40);
// 次へ$p1 オブジェクトの発話メソッドにアクセスします
$ p1 ->say();
// 次に、$p2 オブジェクトの発話メソッドにアクセスします
$ p2 ->say(); //次に、$p3 オブジェクトの Speaker メソッドにアクセスします
$ p3 ->say();
出力結果は次のようになります:
私の名前: Zhang San 性別: 男性 私の年齢: 20
私の名前is: Li Si 性別: 女性 私の年齢: 30
私の名前: Wang Wu 性別: 男性 私の年齢: 40コンストラクターはデフォルトのパブリック メソッドであるため (コンストラクターをプライベートに設定すべきではありません)、また、コンストラクター メソッドはクラス内の関数でもあるため、コンストラクター メソッドを使用してプライベート プロパティに初期値を割り当てることができます。 Say() メソッドはデフォルトでパブリックであるため、外部からアクセスして独自のプライベート プロパティを伝えることができます。
上記の例から、プライベート メンバーはクラス内でのみ使用でき、クラス外からは直接アクセスできないことがわかります。ただし、クラス内にアクセスする権限があるため、プライベート プロパティの割り当てと読み取りが必要になる場合があります。外部からとは、クラスの外部にアクセス可能なインターフェイスを提供することを意味します。上記の例では、コンストラクターは代入の形式ですが、コンストラクターはオブジェクトを作成するときに値を代入するだけです。この既存のオブジェクトに値を割り当てたい場合、コンストラクター メソッドを使用して値を渡すと、既存のオブジェクトではなく新しいオブジェクトが作成されます。したがって、外部からアクセスできるプライベート属性用のインターフェイスをいくつか作成する必要があります。目的は、オブジェクトが存在するときに属性の値を変更してアクセスすることです。ただし、これは必要な属性に対してのみ実行できることに注意してください。外部からアクセスされることを望まないプロパティにはそのようなインターフェイスがありません。そのため、カプセル化の目的はオブジェクト自体によって完了し、オブジェクトへの操作は最小限に抑えられます。外の世界。
类 外部へのインターフェースを提供する場合、プライベート属性を操作するためのプライベート属性の設定メソッドと取得メソッドを提供できます。 例:
PRVATE $ Age; // プライベート属性 age age ) // を提供します。外部向けに年齢を設定するためのパブリックメソッド
{
if ( $ age < 0 || $ age > 130 ) // 属性に値を割り当てるときに、不正な値の設定を避けるためもちろん、同じメソッドを使用して各属性の値を割り当て、取得して外部でアクセス作業を完了することもできます。クラス。
10. 4 つのメソッドの適用 __set() __get() __isset() __unset()
一般的に、クラスの属性は常にプライベートとして定義します。これは、より現実的なロジックに沿ったものです。ただし、属性の読み取りと割り当ての操作は非常に頻繁に行われるため、PHP5 では、属性を取得して割り当てるための 2 つの関数「__get()」と「__set()」、および属性を確認するための「__isset」が事前定義されています。 ) 」と属性を削除するメソッド「 __unset() 」です。
前のセクションでは、各属性の設定および取得メソッドを説明しました。PHP5 には、属性の値を設定および取得するための特別なメソッド、「__set()」と「__get()」の 2 つのメソッドが用意されています。デフォルトでは存在しませんが、コンストラクター メソッド (__construct()) と同様に、クラスに追加された場合にのみ存在します。もちろん、次の 2 つのメソッドを追加できます。 、個人的なスタイルに従って追加できます:
//__get() メソッドはプライベート プロパティを取得するために使用されます
private function __get( $ property_name )
{
if ( isset ( $ this - > () メソッドプライベートプロパティの設定に使用します
プライベート関数 __set( $ property_name , $ value )
{ $ this -> $ property_name = $ value }
__get() メソッド: このメソッドは、プライベート メンバー属性の値を取得するために使用されます。パラメーターは、取得するメンバー属性の名前で渡され、取得された属性値が返されます。このメソッドはプライベート プロパティを直接取得するときにオブジェクトによって自動的に呼び出されるプライベート メソッドにすることもできるため、手動で呼び出す必要はありません。プライベート プロパティはカプセル化されているため、値を直接取得することはできません (例: " echo $p1->name " を直接取得するのは誤りです)。ただし、このメソッドをクラスに追加する場合は、「 echo $p1->name ” は値を直接取得します。__get($property_name) メソッドが自動的に呼び出され、プロパティ名がパラメータ $property_name に渡されます。このメソッドの内部実行を通じて、渡したプライベート値が取得されます。属性の値が返されます。メンバーのプロパティがプライベートとしてカプセル化されていない場合、オブジェクト自体はこのメソッドを自動的に呼び出しません。
__set() メソッド: このメソッドは、プライベート メンバー属性の値を設定するために使用されます。最初のパラメーターは値を設定する属性の名前で、2 番目のパラメーターは値です。戻り値はありません。このメソッドも手動で呼び出す必要はなく、プライベート属性値を直接設定するときにも自動的に呼び出されます
メソッドは許可されていません。例: $this->name= ' zhangsan '。これは失敗しますが、 __set($property_name, $value) メソッドをクラスに追加すると、それをプライベートに直接与えることができます。プロパティに値を代入する際には、名前などのプロパティが $property_name に渡され、代入される値「zhangsan」が $value に渡されるのがこのメソッドの実行を通じて行われます。割り当ては達成されます。メンバーのプロパティがプライベートとしてカプセル化されていない場合、オブジェクト自体はこのメソッドを自動的に呼び出しません。不正な値を渡さないように、このメソッドで判定することもできます。コードは次のとおりです。
class person
{
// 以下は、個人のメンバー属性であり、すべてカプセル化されたプライベート メンバーです
private $ name ; // の名前the person
private $ sex ; プロパティ値が取得されると、__get() メソッドが自動的に呼び出されます
" ;
if ( isset ( $ this -> $ property_name ))
{
return ( $ this -> $ property_name ) ;
}
else
{return ( NULL ) }
}
//__set() メソッドはプライベートプロパティを設定するために使用されます
プライベート関数__set ( $ property_name , $ value )
{
echo "プライベート プロパティの値を直接設定する場合、この __set() メソッドが自動的に呼び出され、プライベート プロパティに値が割り当てられます。"
$ this -> $ property_name = $ value ;
}
}
$ p1 = new
// プライベート属性に値を直接割り当てる場合、__set() メソッドが自動的に呼び出されます。 assign
$ p1 ->name= "Zhang San";
$ p1 ->sex= " Male" ;
$ p1 ->age= 20 ; // プライベートの値を直接取得します属性を指定すると、__get() メソッドが自動的に呼び出され、メンバー属性の値が返されます
echo " Name: " . "
年齢: "
;"
プライベート属性の値を直接設定する場合、__set() メソッドが自動的に呼び出され、プライベート属性に値が割り当てられます。
プライベート属性の値を直接設定する場合、__set() メソッドが自動的に呼び出され、値が割り当てられます。
値を直接設定する場合 private 属性値を取得すると、__set() メソッドが自動的に呼び出され、private 属性値が代入されます
private 属性値を直接取得する場合は、__get() メソッドが呼び出されます。自動的に呼び出されます
名前: Zhang San
private 属性値を直接取得する場合 __get() メソッドが自動的に呼び出される場合
性別: 男性
private 属性値を直接取得する場合、__get() メソッドが自動的に呼び出されます
年齢: 20
上記のコードが_ _get() メソッドと __set() メソッドに追加されていない場合、プライベート メンバーはクラス外で操作できないため、プログラムは誤動作します。また、上記のコードは、自動的に呼び出してカプセル化に直接アクセスするのに役立ちます。プライベートメンバーの __get() メソッドと __set() メソッド。
__isset() メソッド: このメソッドを説明する前に、「isset()」関数の応用を見てみましょう。 isset() は、変数が設定されているかどうかを判断するために使用される関数です。パラメータで渡された変数が存在する場合は true を返し、それ以外の場合は false を返します。では、オブジェクトの外部で「isset()」関数を使用して、オブジェクト内のメンバーが設定されているかどうかを判断する場合、それを使用できるでしょうか?オブジェクト内のメンバーがパブリックである場合、この関数を使用してメンバー属性を測定できますが、プライベートなメンバー属性はカプセル化されているため、この関数は機能しません。外部に露出します。では、オブジェクトの外部で「isset()」関数を使用して、プライベートメンバー属性が設定されているかどうかを判断することはできないのでしょうか?はい、「__isset()」メソッドをクラスに追加するだけで済みます。オブジェクト内のプライベートメンバーが設定されているかどうかを判断するために「isset()」関数がクラスの外部で使用される場合、この関数は内部で自動的に呼び出されます。 「__isset()」メソッドはそのような操作を完了するのに役立ち、「__isset()」メソッドをプライベートにすることもできます。次のコードをクラスに追加するだけです:
private function __isset( $ nm )
{
echo " isset() 関数がプライベート メンバー $nm を決定するためにクラスの外で使用されると、自動的に呼び出されます< ;br>" ;
return isset ( $ this -> $ nm );
}
__unset() メソッド: このメソッドを検討する前に、まず「 unset() 」関数を見てみましょう。 unset() "この関数の機能は、指定された変数を削除して true を返すことです。パラメータは削除する変数です。では、オブジェクトの外部にあるオブジェクト内のメンバー属性を削除したい場合は、「unset()」関数を使用できますか? オブジェクト内のメンバー属性がパブリックである場合、この関数を使用して削除できます。オブジェクトのパブリック属性。オブジェクトのメンバー属性がプライベートである場合、同様に、オブジェクトに「__unset()」メソッドを追加する場合も同様です。 、オブジェクトのプライベート メンバー プロパティから削除できます。 「__unset()」メソッドをオブジェクトに追加した後、オブジェクトの外部で「unset()」関数を使用してオブジェクト内のプライベートメンバー属性を削除すると、「__unset()」関数が自動的に呼び出され、オブジェクト内でプライベート メンバー属性を使用する場合、このメソッドをクラス内でプライベートとして定義することもできます。次のコードをオブジェクトに追加するだけです:
private function __unset( $ nm )
{
echo "プライベート メンバーを削除するためにクラス外で unset() 関数が使用されると自動的に呼び出されます
" ; ( $ this -> $ nm );
}
完全な例を見てみましょう:
class person
{
// 以下は person
private のメンバー属性です。 $ name ; // 人の名前
private $ sex ; // 人の性別
private $ age ; function __get( $ property_name )
{
if ( isset ( $ this -> $ property_name ) )
{
return ( $ this -> $ property_name );
} else {
return ( NULL ) }
}
//__set() メソッドはプライベートプロパティを設定するために使用されます
プライベート関数 __set( $ property_name , $ value )
{
$ this -> $ property_name = $ value}
//__isset() メソッド
プライベート関数 __isset( $ nm )
{
echo "isset() 関数はプライベートメンバーを決定するときに自動的に呼び出します。"
return isset ( $ this -> $ nm ) }
//__unset() メソッド
private function __unset( $ nm )
{
echo " unset() 関数がプライベート メンバーを削除するために使用されるときに自動的に呼び出されます
unset ( $ this -> $ nm );
}
}
$ p1 = new Person();
$ p1 ->name= "これは人の名前です"
// プライベートメンバーを決定するために isset() 関数を使用するときに自動的に呼び出されます__isset() メソッドはそれを完了するのに役立ち、返される結果は true です
echo $ p1 ->name) ; "
" ;br> ;" ;
// unset() 関数を使用してプライベート メンバーを削除する場合、タスクを完了して name private 属性を削除するために __unset() メソッドが自動的に呼び出されます
unset ( $ p1 -> name);
// すでに削除されているため、この行には出力はありません
echo $ p1 ->name;
?>
出力結果は次のようになります:
isset() 関数プライベートメンバーを測定するときに
bool(true) を呼び出しますこれは人の名前です
プライベートメンバーを削除するためにクラス外で unset() 関数が使用されるときに自動的に呼び出されます__set(), __get(), __isset(), __unset( ) これら 4 つのメソッドはすべて私たちが追加したものです。オブジェクトの内部では、オブジェクトの外部でオブジェクト内部のプライベート プロパティの操作を完了するために必要なときに自動的に呼び出されます。