|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
因为函数实在是太多了,慢慢的你就会知道,知道有这个函数就可以。object|php5 /*
+-------------------------------------------------------------------------------+
| = 本文为Haohappy读<<Core PHP Programming>>
| = 中Classes and Objects一章的笔记
| = 翻译为主+团体心得
| = 为防止能够产生的不用要的费事请勿转载,感谢
| = 接待品评斧正,但愿和一切PHP喜好者配合前进!
+-------------------------------------------------------------------------------+
*/
第九节--绑定
除限制会见,会见体例也决意哪一个办法将被子类挪用或哪一个属性将被子类会见. 函数挪用与函数自己的联系关系,和成员会见与变量内存地址间的关系,称为绑定.
在盘算机言语中有两种次要的绑定体例―静态绑定和静态绑定. 静态绑定产生于数据布局和数据布局间,法式履行之前. 静态绑定产生于编译期, 因而不克不及使用任何运转期的信息. 它针对函数挪用与函数的主体,或变量与内存中的区块. 由于PHP是一种静态言语,它不利用静态绑定. 然而可以摹拟静态绑定.
静态绑定章针对运转期发生的会见恳求,只用到运转期的可用信息. 在面向对象的代码中,静态绑定意味着决意哪一个办法被挪用或哪一个属性被会见,将基于这个类自己而不基于会见局限.
Public和protected成员的举措相似于PHP的前几个版本中函数的举措,利用静态绑定. 这意味着假如一个办法会见一个在子类中被覆写的类成员,并是一个子类的实例,子类的成员将被会见(而不是会见父类中的成员).
看例子6.10. 这段代码输入” Hey! I am Son.” 由于当PHP挪用getSalutation, 是一个Son的实例,是将Father中的salutation覆写而来. 假如salutation是public的,PHP将发生不异的了局. 覆写办法的操作很相似.在Son中,关于identify的挪用绑定到谁人办法.
即便在子类中会见体例被从protected减弱成public, 静态绑定依然会产生. 依照会见体例利用的准绳,加强关于类成员的会见限制是不成能的. 所以把会见体例从public改动成protected不成能停止.
Listing 6.10 Dynamic binding 静态绑定
<?php
class Father
{
protected $salutation = "Hello there!"; //问候
public function getSalutation()
{
print("$this->salutationn");
$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->salutationn");
$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");
?>
为何private的类成员摹拟静态绑定? 为了回覆这个成绩, 你需求回想一下为何需求有private成员.甚么时分用它们来取代protected成员是成心义的?
private成员只要当你不想让子类承继改动或特别化父类的行动时才用到. 这类情形比你想像的要少. 凡是来讲,一个好的对象分层布局应该答应绝大多半功效被子类特别化,改善,或改动―这是面向对象编程的基本之一. 必定的情形下需求private办法或变量,例如当你确信你不想答应子类改动父类中的某个特定的部分. 第1步环境配置好了,你算了进了1小步了,那么第2步呢 就是调出第1个程序 一般都是用hello world,视频教程里面我都做了,hello world |
|