第九节--绑定 -- Classes and Objects in PHP5 [9]/* <?php
class Father
{
protected $salutation = "Hello there!"; //问候
public function getSalutation()
{
print("$this->salutation\n");
$this->identify();
}
protected function identify()
{
print("I am Father.<br>\n");
}
};
class Son extends Father
{
protected $salutation = "Hey!"; //父类中的protected $salutation 被覆写
protected function identify() //父类中的protected identify() 被覆写
{
print("I am Son.<br>\n");
}
};
$obj = new Son();
$obj->getSalutation(); //输出Hey! I am Son.
?>
//注: 在子类中没有覆写getSalutation(),但实际上仍然存在一个getSalutation().这个类中的$salutation和identify() //与Son子类的实例中的getSalutation()方法动态绑定,所以调用Son的实例的getSalutation()方法, //将调用Son类中的成员salutation及identify(),而不是父类中的成员salutation及identify(). Private成员只存在于它们所在的类内部. 不像public和protected成员那样,PHP模拟静态绑定. 看例子6.11. 它输出”Hello there! I am Father.”,尽管子类覆写了salutation的值. 脚本将this->salutation和当前类Father绑定. 类似的原则应用于private方法identify(). Listing 6.11 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.<br>\n");
}
}
class Son extends Father
{
private $salutation = "Hey!";
private function identify()
{
print("I am Son.<br>\n");
}
}
$obj = new Son();
$obj->getSalutation(); //输出Hello there! I am Father.
?>
动态绑定的好处是允许继承类来改变父类的行为,同时可以保持父类的接口和功能. 看例子6.12. 由于使用了动态绑定,在deleteUser中被调用的isAuthorized的version 可以由对象的类型来确定. 如果是一个普通的user,PHP调用User::isAuthorized会返回FALSE.如果是一个AuthorizedUser的实例,PHP调用AuthorizedUser::isAuthorized,将允许deleteUser顺利执行. //haohappy注:用一句话说清楚,就是对象类型与方法,属性绑定. 调用一个父类与子类中都存在的方法或访问一个属性时,会先判断实例属于哪种对象类型,再调用相应的类中的方法和属性. Listing 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>\n");
return(FALSE);
}
//delete the user
print("User deleted.<br>\n");
}
}
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");
?> 更多相关文章
|
推荐文章
精彩文章
|