セクション 9 - バインディング
アクセスを制限することに加えて、アクセス メソッドは、サブクラスによって呼び出されるメソッド、またはサブクラスによってアクセスされる属性、および関数呼び出しと関数自体の関係も決定します。メンバーアクセスと変数メモリアドレス間の関係はバインディングと呼ばれます
コンピューター言語には静的バインディングと動的バインディングの 2 つのバインディング方法があり、静的バインディングはプログラムの実行前に行われます。コンパイル時には、関数呼び出しと関数本体、または変数とメモリ ブロックを対象とします。PHP は静的バインディングを使用しませんが、静的バインディングをシミュレートできます。バインディングは、実行時に利用可能な情報のみを使用して、実行時に生成されるアクセス要求に対するものです。オブジェクト指向コードでは、動的バインディングは、アクセス スコープではなくクラス自体に基づいて、どのメソッドが呼び出されるか、またはどのプロパティにアクセスするかを決定することを意味します。
パブリック メンバーとプロテクト メンバーは、動的バインディングを使用して、以前のバージョンの PHP の関数と同様に動作します。つまり、メソッドがサブクラス クラス メンバーでオーバーライドされるメソッドにアクセスし、サブクラスのインスタンスである場合、そのメソッドはサブクラスのメンバーになります。 (親クラスのメンバーにアクセスするのではなく)
例 6.10 を参照してください。これは、PHP が Son のインスタンスである getSalutation を呼び出すと、Father の挨拶が上書きされるためです。挨拶文が public の場合、PHP は、Son でそのメソッドにバインドするための呼び出しと非常に似た結果を生成します。アクセス メソッドを使用する原則に従って、クラス メンバーのアクセス制限を強化することは不可能です。つまり、アクセス モードを public から protected に変更することは不可能です。
リスト 6.10 動的バインディング動的バインディング
<?php class Father { protected $salutation = "Hello there!"; //问候 public function getSalutation() { print("$this->salutation "); $this->identify(); } protected function identify() { print("I am Father.<br> "); } }; class Son extends Father { protected $salutation = "Hey!"; //父类中的protected $salutation 被覆写 protected function identify() //父类中的protected identify() 被覆写 { print("I am Son.<br> "); } }; $obj = new Son(); $obj->getSalutation(); //输出Hey! I am Son. ?>
<?php class Father { private $salutation = "Hello there!"; public function getSalutation() { print("$this->salutation "); $this->identify(); } private function identify() { print("I am Father.<br> "); } } class Son extends Father { private $salutation = "Hey!"; private function identify() { print("I am Son.<br> "); } } $obj = new Son(); $obj->getSalutation(); //输出Hello there! I am Father. ?>
<?php class User //用户 { protected function isAuthorized() //是否是验证用户 { return(FALSE); } public function getName() //获得名字 { return($this->name); } public function deleteUser($username) //删除用户 { if(!$this->isAuthorized()) { print("You are not authorized.<br> "); return(FALSE); } //delete the user print("User deleted.<br> "); } } class AuthorizedUser extends User //认证用户 { protected function isAuthorized() //覆写isAuthorized() { return(TRUE); } } $user = new User; $admin = new AuthorizedUser; //not authorized $user->deleteUser("Zeev"); //authorized $admin->deleteUser("Zeev"); ?>