澳门新浦京娱乐游戏第九节

/*

+——————————————————————————-+

| = 本文为Haohappy读Core PHP Programming

| = 中Classes and Objects一章的笔记

| = 翻译为主+个人心得

| = 为避免可能发生的不必要的麻烦请勿转载,谢谢

| = 欢迎批评指正,希望和所有PHP爱好者共同进步!

| = PHP5研究中心:

+——————————————————————————-+

*/

第九节–绑定

除了限制访问,访问方式也决定哪个方法将被子类调用或哪个属性将被子类访问.
函数调用与函数本身的关联,以及成员访问与变量内存地址间的关系,称为绑定.

在计算机语言中有两种主要的绑定方式静态绑定和动态绑定.
静态绑定发生于数据结构和数据结构间,程序执行之前. 静态绑定发生于编译期,
因此不能利用任何运行期的信息.
它针对函数调用与函数的主体,或变量与内存中的区块.
因为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-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. ?
You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图