background image

   $obj->getSalutation();  //输出 Hey! I am Son.
?>
//注: 在子类中没有覆写 getSalutation(),但实际上仍然存在一 getSalutation().这个类中的
$salutation 和 identify()
//与 Son 子类的实例中的 getSalutation()方法动态绑定,所以调用 Son 的实例的 getSalutation()
方法,
//将调用 Son 类中的成员 salutation 及 identify(),而不是父类中的成员 salutation 及 identify().
Private 成员只存在于它们所在的类内部. 不像 public 和 protected 成员那样,PHP 模拟静态绑
定. 看例子图 2 . 

它输出 Hello there! I am Father.”,尽管子类覆写了 salutation 的值. 脚本将

this->salutation 和当前类 Father 绑定. 类似的原则应用于 private 方法 identify().
Binding and private members
<?php
   class Father
   {
       private $salutation = "Hello there!";
       public function getSalutation()
       {
           print("$this->salutation\n");
           $this->identify();
       }
       private function identify()
       {
           print("I am Father.\n");
       }
   }
   class Son extends Father
   {
       private $salutation = "Hey!";
       private function identify()
       {
           print("I am Son.\n");
       }
   }
   $obj = new Son();
   $obj->getSalutation(); //输出 Hello there! I am Father.
?>
动态绑定的好处是允许继承类来改变父类的行为,同时可以保持父类的接口和功能. 看例
子图 3. 由于使用了动态绑定,在 deleteUser 中被调用的 isAuthorized 的 version 可以由对象
的类型来确定. 如果是一个普通的 user,PHP 调用 User::isAuthorized 会返回 FALSE.如果是
一个 AuthorizedUser 的实例,PHP 调用 AuthorizedUser::isAuthorized,将允许 deleteUser 顺利
执行.
//haohappy 注:用一句话说清楚,就是对象类型与方法,属性绑定. 调用一个父类与子类中都
存在的方法或访问一个属性时,会先判断实例属于哪种对象类型,再调用相应的类中的方法
和属性.