ホームページ  >  記事  >  バックエンド開発  >  セクション 9 - バインディング - PHP5 のクラスとオブジェクト [9]_PHP チュートリアル

セクション 9 - バインディング - PHP5 のクラスとオブジェクト [9]_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 17:20:48769ブラウズ

セクション 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. 

?> 



//注: getSalutation() はサブクラスでオーバーライドされませんが、このクラスには $salutation() がまだ存在します
// getSalutation() に動的にバインドされています。 Son サブクラスのインスタンスのメソッドなので、Son インスタンスの getSalutation() メソッドを呼び出すと、
//親のメンバー salutation とidentify() の代わりに、Son クラスのメンバー salutation とidentify() が呼び出されます。

プライベート メンバーは、パブリック メンバーや保護されたメンバーとは異なり、サブクラスが上書きする場合でも、静的バインディングをシミュレートします。スクリプトは this->salutation を現在のクラス Father にバインドします。同様の原則がプライベート メソッドidentify() にも適用されます。

リスト 6.11 バインディングとプライベート メンバー
<?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. 

?>



動的バインディングを使用しているため、deleteUser で呼び出される isAuthorized のバージョンは、親クラスのインターフェイスと関数を維持しながら、継承されたクラスが親クラスの動作を変更できるようになります。通常のユーザーの場合、PHP が User::isAuthorized を呼び出すと FALSE が返されます。AuthorizedUser のインスタンスの場合、PHP が AuthorizedUser::isAuthorized を呼び出すと、deleteUser がスムーズに実行されます。一言で言えば、それはオブジェクト タイプ、メソッド、および属性のバインディングです。親クラスとサブクラスの両方に存在するメソッドを呼び出すとき、または属性にアクセスするとき、最初にインスタンスがどのオブジェクト タイプに属しているかを決定します。次に、対応するクラスのメソッドとプロパティを呼び出します。

リスト 6.12 動的バインディングの利点
<?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"); 

?> 



なぜプライベート クラスのメンバーが静的バインディングをシミュレートするのか? この質問に答えるには、なぜプライベート メンバーがあるのか​​を思い出す必要があります。保護されたメンバーの代わりにそれらを使用するのはどのような場合ですか?

プライベート メンバーは、親クラスの変更または特殊化の動作をサブクラスに継承させたくない場合にのみ使用されます。これは、一般的に考えられるほど一般的ではありません。優れたオブジェクト階層では、ほとんどの関数をサブクラスによって特殊化、改善、または変更できるようにする必要があります。これは、プライベート メソッドまたは変数が、確実に必要な場合など、特定の状況で必要になるオブジェクト指向プログラミングの基礎の 1 つです。サブクラスが親クラスの特定の部分を変更することを許可したくない





http://www.bkjia.com/PHPjc/532554.html
www.bkjia.com
tru​​e

http://www.bkjia.com/PHPjc/532554.html技術記事セクション 9 - バインディングは、アクセスを制限するだけでなく、サブクラスによってどのメソッドが呼び出されるか、またはサブクラスによってどの属性がアクセスされるか、また、関数呼び出しと関数自体の間の関係、およびメンバー アクセスと変数も決定します。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。