ホームページ  >  記事  >  バックエンド開発  >  PHP オブジェクト指向ガイド (5) Encapsulation_PHP チュートリアル

PHP オブジェクト指向ガイド (5) Encapsulation_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:43:52731ブラウズ

9. カプセル化
カプセル化は、オブジェクト指向プログラミングの 3 つの主要な特徴の 1 つであり、オブジェクトのプロパティとサービスを独立した同一のユニットに結合し、オブジェクトの内部の詳細を最大限に隠すことです。 2 つを含む可能性があります。 意味: 1. オブジェクトのすべての属性とすべてのサービスを結合して、分割できない独立した単位 (つまり、オブジェクト) を形成します。 2. 情報隠蔽、つまり、物体の内部詳細を可能な限り隠し、外界との境界を形成(または障壁を形成)し、外界と接続するための限られた外部インターフェースのみを保持する。
カプセル化の原理はソフトウェアに反映されています。カプセル化では、オブジェクト以外の部分がオブジェクトの内部データ
(プロパティ) に自由にアクセスできないことが必要です。これにより、外部エラーの「相互感染」を効果的に回避し、ソフトウェア エラーがローカライズされるため、エラーのチェックとデバッグの難しさが大幅に軽減されます。
ある人のオブジェクトに年齢や給与などの属性があるとします。
カプセル化を使用しない場合、他の人はそれを知りたがります。は取得できますが、カプセル化すると、自分が教えない限り、他の人はそのカプセル化された属性を取得できなくなります。たとえば、パソコンにはパスワードがありますが、あなたはパスワードを持っていません。他の人は自由にログインでき、それをコピーしてコンピューターに
貼り付けることができます。また、人間のような物体においては、身長や年齢といった属性は自分自身でのみ増加させることができ、他人が任意に値を割り当てることはできません。
private キーワードを使用してプロパティとメソッドをカプセル化します:
元のメンバー:
var $name; //宣言者の名前
var $sex; //宣言者の性別
var $age; //関数 run(){… … .}
カプセル化された形式に変更します:
private $name; //プライベート キーワードを使用して個人の名前をカプセル化します
private $sex; //個人の性別の秘密キーを使用してカプセル化します
private $age;人の年齢をカプセル化するプライベートキーワード
private function run(){... ... } //プライベートキーワードを使用して人の歩き方をカプセル化します
注: メンバー属性である限り、他のキーワードがある場合先頭では、元のキーワード「var」を削除する必要があります。
プライベートを通じて人間のメンバー (メンバー属性とメンバーメソッド) をカプセル化できます。パッケージのメンバーにはクラスの外部から直接アクセスできません。次のコードではエラーが発生します。
コードスニペット



コードは次のとおりです。 class Person{
/ /以下は人物のメンバー属性です
private $name; //人物の名前はprivate
private $sex; //人物の性別はprivate
private $age;その人の年齢、private でカプセル化
//この人の話し方
function Say(){
echo "私の名前は: ".$this->name." 性別: ".$this->sex."私の年齢は: ".$this->age."
";
}

//この人が歩くことができるメソッドは、private private function run(){ echo "この人は歩いています"; } }
//人のインスタンスオブジェクトをインスタンス化します
$p1=new Person();
//プライベート属性に値を割り当てようとすると、エラーが発生します
$p1->name= "Zhang San";
$p1->sex="男";
$p1->age=20;
//プライベート属性を印刷しようとすると、エラーが発生します
echo $p1->name. ”< br>”;
echo $p1->sex.”
”;
echo $p1->age.”

//プライベートメンバーメソッドを出力しようとすると、エラーが発生します発生
$p1->run();


出力結果は次のとおりです:
致命的エラー: プライベート プロパティ Person::$name にアクセスできません
致命的エラー: プライベート プロパティ Person::$sex にアクセスできません
致命的エラー: できませんプライベート プロパティ Person::$age にアクセスします
致命的なエラー: プライベート プロパティ Person::$name にアクセスできません
致命的なエラー: コンテキスト '' からプライベート メソッド Person::run() を呼び出します
上記の例からわかるように、privateプライベート メンバーはこのオブジェクト内でのみアクセスできるため、メンバーには外部からアクセスできません。たとえば、オブジェクト $p1 はプライベート プロパティを共有する必要があり、say() メソッド属性でアクセスします。これは問題ありません。 (アクセス制御は追加されません。デフォルトはパブリックで、どこからでもアクセスできます)
コードスニペット



コードをコピー

コードは次のとおりです:

//この人が話す方法は、次のことです。彼自身 プライベート プロパティ、プライベート メソッドにもここからアクセスできます
function Say(){
echo "私の名前は: ".$this->name." 性別: ".$this->sex." 私の年齢は: ".$this->age."
";
//ここからプライベート メソッドにアクセスすることもできます
//$this->run();
}


メンバーメソッドsay()はパブリックなので、クラスの外でsay()メソッドを呼び出して上記の
コードを変更できます
コードスニペット
コードをコピーします コードは次のとおりです:

class Person{
//以下は person のメンバー属性です
private $name; // 個人の名前は private
private $sex にカプセル化されます // 個人の性別は private
private $age; // 人の年齢は private によってカプセル化されます
// プライベート属性 name $name、性別 $sex 、年齢 $age に値を割り当てるコンストラクター パラメーターを定義します
function __construct($name, $sex, $age){
/ /構築メソッドを通じて渡された $name は、プライベート メンバー プロパティ $this->name に初期値が割り当てられます
$this->name=$name;
//構築メソッドを通じて渡された $sexメソッドはプライベート メンバーに割り当てられます property$ this->sex には初期値が割り当てられます
$this->sex=$sex;
//構築メソッドを通じて渡された $age はプライベート メンバーに初期値が割り当てられますmember property $this->age
$this-> ;age=$age;
}
//この人は話すことができ、自分のプライベート プロパティを話すことができ、ここからプライベート メソッドにアクセスすることもできます
function Say(){
echo "私の名前は: ".$this ->name." 性別: ".$this->性別" 私の年齢: ".$this->age."
";
}
//コンストラクター メソッドを通じて作成された 3 つのオブジェクト $p1、p2、$p3 は、それぞれ名前、性別、年齢の 3 つの異なる実際のパラメーターを渡します
$p1=new Person("张三","男", 20) ;
$p2=new Person("李四","女", 30);
$p3=new Person("王五","男", 40); 以下は、 $p1 オブジェクト
$p1->say();
//以下は $p2 オブジェクトの発話メソッドにアクセスします
$p2->say();
//以下は $p3 の発話メソッドにアクセスしますobject
$p3->say();


出力結果は次のとおりです: 私の名前: Zhang San 性別: 男性 私の年齢: 20
私の名前: Li Si 性別: 女性 私の年齢: 30
私の名前:Wang Wu 性別:男性 年齢:40歳
コンストラクターはデフォルトのパブリックメソッドなので(コンストラクターをプライベートに設定しないでください)、このようにしてクラス外からアクセスすることができます。さらに、コンストラクターはクラス内の関数でもあるため、構築メソッドを使用してプライベート プロパティに初期値を割り当てることができます。 Say() メソッドはデフォルトでパブリックなので、
自分のプライベート プロパティとして外部からアクセスすることもできます。
上記の例から、プライベートメンバーはクラス内でのみ使用でき、クラス外から直接アクセスすることはできません
が、クラス内ではアクセスできるため、場合によってはプライベートに値を割り当てる必要があることがわかります。つまり、上記の例では、コンストラクターは代入の一種ですが、コンストラクターはオブジェクトの作成時に値を代入するだけです。すでに既存のオブジェクトがあり、この既存のオブジェクトに値を割り当てたい場合、この時点でコンストラクター メソッドも使用して値を渡すと、このオブジェクトは既に存在するのではなく、新しいオブジェクトが作成されます。したがって、外部からアクセスできるプライベート属性用のいくつかの
インターフェイスを作成する必要があります。目的は、オブジェクトが存在するときに属性の値を変更してアクセスすることです。ただし、変更する必要があるのは属性のみであることに注意してください。このように、外部からアクセスすることを意図していないプロパティにはそのようなインターフェイスがないため、カプセル化の目的は最小限の操作でオブジェクト自体によって完了できます。できるだけ外の世界に向けて。
クラスの外にインターフェイスを提供する場合、プライベート プロパティを操作するためにクラスの外に設定メソッドと取得メソッドを提供できます。 例:
コード スニペット



コードをコピー

コードは次のとおりです。

prvate $ age; //プライベート属性 age
function setAge($age) {
//外部から年齢を設定するためのパブリックメソッドを提供します
if($age<0 || $age>130) //値を割り当てるとき属性に不正な値を設定しないようにするため、属性に追加します
return;

$this->age=$age; } function getAge(){ // 年齢を外部から取得するための public メソッドを提供します return( $this-> 年齢 );
上記のメソッドはメンバー属性の値を設定および取得するものですが、同じメソッドを各属性に使用して値を割り当て、クラスの外でアクセス作業を完了することもできます。

http://www.bkjia.com/PHPjc/320648.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/320648.html技術記事 9. カプセル化 カプセル化は、オブジェクト指向プログラミングの 3 つの主要な特徴の 1 つであり、オブジェクトのプロパティとサービスを独立した同一のユニットに結合し、オブジェクトの内部を可能な限り隠すことです。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。