$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 注:用一句话说清楚,就是对象类型与方法,属性绑定. 调用一个父类与子类中都
存在的方法或访问一个属性时,会先判断实例属于哪种对象类型,再调用相应的类中的方法
和属性.