9. カプセル化
カプセル化は、オブジェクト指向プログラミングの 3 つの主要な特徴の 1 つであり、オブジェクトのプロパティとサービスを
の独立した同一のユニットに結合することです。オブジェクトの内部詳細を隠すことには 2 つの意味があります。 1. オブジェクトのすべての属性とすべてのサービスを結合して、分割できない独立した単位 (つまり、オブジェクト) を形成する。 2. 情報の隠蔽。つまり、オブジェクトの内部の詳細を可能な限り隠し、外界との境界を形成し(または障壁を形成し)、外界と接続するための限られた外部インターフェイスのみを保持します。ソフトウェアにおける
カプセル化の原理の反映は、オブジェクト以外の部分がオブジェクトの内部データ
(属性) に自由にアクセスできないことを要求し、それによって外部データの「相互感染」を効果的に回避します。エラーとその原因 ソフトウェア エラーを特定できるため、トラブルシューティングやトラブルシューティングの困難さが大幅に軽減されます。
例を使用して、ある人のオブジェクトに年齢や給与などの属性があるとします。そのような個人のプライバシー属性
は、カプセル化を使用しない場合、他の人が取得できるようになります。彼らは知りたいと思っていますが、
それをカプセル化すると、あなたがそれを伝えない限り、他の人はカプセル化された属性を取得する方法がありません
別の例として。 、すべてのパソコンにはパスワードがあります。他人に自由にログインさせたくない場合は、パスワードをコピーして
コンピュータに貼り付けてください。また、人間などの物体の場合、身長や年齢などの属性は自分自身でのみ増加させることができ、他人が任意に割り当てることはできません。
private キーワードを使用してプロパティとメソッドをカプセル化します。
元のメンバー:
var $name; //宣言者の名前
var $sex; //宣言者の性別
var $age; //その人の年齢を宣言します
function run(){… … .}
カプセル化された形式に変更します:
private $name //その人の名前には private キーワードを使用します Encapsulateprivate $sex; //プライベート キーワードを使用して個人の性別をカプセル化します
private $age //プライベート キーワードを使用して個人の年齢をカプセル化します
private function run(){… … } //プライベート キーワードを使用します人の歩行方法をカプセル化する
注: メンバー属性の前に他のキーワードがある限り、元のキーワード「var」を削除する必要があります。
プライベートを通じて人間のメンバー (メンバーのプロパティとメンバーのメソッド) をカプセル化できます。パッケージ内のメンバーにはクラスの外部から
直接アクセスできません。次のコードではエラーが生成されます。
コード スニペット
コードをコピーします
コードは次のとおりです。
class Person{ //以下は person のメンバー属性ですprivate $name;その人の名前は、privateprivate $sex でカプセル化されます。 //その人の性別、privateprivate $age でカプセル化されます。 //その人の年齢、private
でカプセル化されます。//この人ができる方法speechfunction Say(){
echo "私の名前は: ".$this->name." 性別: ".$this->性別" 私の年齢: ".$this-> ;age. "
";
}
//この人が歩くことができるメソッドはプライベートにカプセル化されます
private function run(){
echo "この人は歩いています";
}
}
//人のインスタンス オブジェクトをインスタンス化します
$p1=new Person();
//プライベート属性に値を割り当てようとすると、エラーが発生します
$ p1->name="張三";
$p1->sex="男性";
$p1->age=20>//プライベート属性を出力しようとしています、結果 エラーが発生します
echo $p1->name.”
”;
echo $p1->sex.”
echo $p1->”; ;age. "
"
//プライベートメンバーメソッドを出力しようとするとエラーが発生します
は:
致命的なエラー: プライベート プロパティにアクセスできません Person::$name
致命的なエラー: プライベート プロパティ Person::$sex にアクセスできません
致命的なエラー: プライベート プロパティ Person::$age にアクセスできません
致命的エラー: プライベート プロパティ Person::$name にアクセスできません
致命的エラー: コンテキスト '' からプライベート メソッド Person::run() を呼び出します
上記の例からわかるように、プライベート メンバーには外部からアクセスできませんプライベートメンバーはこのオブジェクト
内でのみアクセスできるため、たとえば、$p1 オブジェクトがプライベート属性を共有したい場合は、say() メソッドでプライベート属性にアクセスします。 (アクセス制御は追加されません。デフォルトはパブリックで、どこからでもアクセスできます。)
//$this->run() } コードをコピーします コードは次のとおりです。 class Person{ if($age<0 || $age>130) //属性に値を代入する際、不正な値が属性に設定されることを避けるためreturn; $this-> ;age=$age; } function getAge(){ // 年齢を外部から取得するための public メソッドを提供します }
メンバー メソッドsay() は public であるため、上記の
コードを変更します。
//以下は person のメンバー属性です
private $name;個人の名前、private
private $sex でカプセル化 //個人の性別は private
private $age でカプセル化 //個人の年齢は private
でカプセル化されます。コンストラクター パラメーターはプライベート属性名 $name、性別 $sex、年齢 $age に割り当てられます。
function __construct($name, $sex, $age){
//コンストラクターを通じて渡される $nameメソッドはプライベート メンバーに割り当てられます。属性 $this->name には初期値が割り当てられます。
$this->name=$name
//構築メソッドを通じて渡された $sex には、プライベート メンバー属性の初期値 $this->sex Value
$this->sex=$sex;
//コンストラクターを通じて渡された $age は、プライベート メンバー プロパティに初期値が割り当てられます。 $this->age
$this->age =$age;
}
//この人の話し方、個人的なプロパティの話し方、ここからプライベート メソッドにアクセスすることもできます。 🎜>function Say(){
echo "私の名前 名前: ".$this->name." 性別: ".$this->性別" 私の年齢: ".$this->age ."
";
}
}
//構築メソッドを通じて 3 つのオブジェクト $p1、p2、$p3 を作成し、3 つの異なる実際のパラメーターを渡します: 名前、性別、年齢
$p1=新しい人("張三","男性", 20);
$p2=新しい人("李思","女性", 30); "王五","男", 40) ;
//以下は $p1 オブジェクトの発話メソッドにアクセスします
$p1->say();
//以下は発話メソッドにアクセスします$p2 オブジェクトのメソッド
$p2->say ();
//以下は $p3 オブジェクトの発話メソッドにアクセスします
$p3->say(); 🎜>
出力結果は次のとおりです。
私の名前は: Zhang San 性別: 男性 私の年齢: 20
私の名前は: Li Si 性別: 女性 私の年齢: 30
私の名前は: Wang Wu 性別: 男性 私の年齢: 40 歳
独自のプライベート属性を呼び出します。
上記の例から、プライベート メンバーはクラス内でのみ使用でき、クラス外から直接アクセスすることはできません
が、クラス内ではアクセスできるため、場合によっては値を割り当てる必要があることがわかります。プライベート プロパティにアクセスし、クラスの外でそれらを読み出します
。つまり、クラスの外にアクセス可能なインターフェイスを提供します。上記の例では、構築メソッドは代入
の形式ですが、構築メソッドのみです。オブジェクトの作成時に値を割り当てます。すでに既存のオブジェクトがあり、この既存のオブジェクトに値を割り当てたい場合、この時点でコンストラクター メソッドも使用して値を渡すと、
新しいオブジェクトが作成されます。 、これは既存のオブジェクトではありません。したがって、外部からアクセスできるプライベート属性用のいくつかの
インターフェイスを作成する必要があります。目的は、オブジェクトが存在するときに属性の値を変更してアクセスすることです。ただし、必要なのは外部
のみであることに注意してください。これは、変更されたプロパティに対してのみ行われ、外部からアクセスされないプロパティにはこのようなインターフェイスはありません。これにより、すべての機能が完了します。オブジェクト自体は、外部の世界にできるだけ少ない操作を提供します。
クラスの外にインターフェイスを提供する場合、クラスの外にプライベート プロパティの設定メソッドと取得メソッドを提供して、プライベート
プロパティを操作できます。たとえば、
コード スニペット
コードをコピー
コードは次のとおりです:
private $age; //プライベート属性 age
function setAge($age) {
/ /外部提供 年齢を設定するためのパブリックメソッド
上記のメソッドは、メンバー属性の値を設定および取得するものです。もちろん、各属性に同じメソッドを使用して
を割り当てることもできます。値を取得してクラス外へのアクセスを完了します。