php5.3后静态绑定用法详解
本篇章节讲解php5.3后静态绑定用法。分享给大家供大家参考,具体如下: 手册原文:自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能, 用于在继承范围内引用静态调用的类。准确说,后期静态绑定工作原理是存储了在上一个"非转发调用"(non-forwarding call)的类名。当进行静态方法调用时,该类名即为明确指定的那个(通常在 :: 运算符左侧部分);当进行非静态方法调用时,即为该对象所属的类。所谓的"转发调用"(forwarding call)指的是通过以下几种方式进行的静态调用:self::,parent::,static:: 以及 forward_static_call()。可用 get_called_class() 函数来得到被调用的方法所在的类名,static:: 则指出了其范围。 该功能从语言内部角度考虑被命名为"后期静态绑定"。"后期绑定"的意思是说,static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可以称之为"静态绑定",因为它可以用于(但不限于)静态方法的调用。 self:: 的限制使用 self:: 或者 __CLASS__ 对当前类的静态引用,取决于定义当前方法所在的类: Example #1 self:: 用法 以上例程会输出: A 后期静态绑定的用法 后期静态绑定本想通过引入一个新的关键字表示运行时最初调用的类来绕过限制。简单地说,这个关键字能够让你在上述例子中调用 test() 时引用的类是 B 而不是 A。最终决定不引入新的关键字,而是使用已经预留的 static 关键字。 Example #2 static:: 简单用法 以上例程会输出: B Note: 在非静态环境下,所调用的类即为该对象实例所属的类。由于 $this-> 会在同一作用范围内尝试调用私有方法,而 static:: 则可能给出不同结果。另一个区别是 static:: 只能用于静态属性。 Example #3 非静态环境下使用 static:: foo();
static::foo();
}
}
class B extends A {
/* foo() will be copied to B,hence its scope will still be A and
* the call be successful */
}
class C extends A {
private function foo() {
/* original method is replaced; the scope of the new one is C */
}
}
$b = new B();
$b->test();
$c = new C();
$c->test(); //fails
?>
以上例程会输出: success! success! success! Fatal error: Call to private method C::foo() from context 'A' in /tmp/test.php on line 9 Note: 后期静态绑定的解析会一直到取得一个完全解析了的静态调用为止。另一方面,如果静态调用使用 parent:: 或者 self:: 将转发调用信息。 Example #4 转发和非转发调用 以上例程会输出: A C C 下面示例分析了基于PHP后期静态绑定功能解决在继承范围内引用静态调用的类。 先看如下代码: 很明显,结果不是我们预期的,这是因为self::取决于定义时所在的类,而不是运行中的类。为了解决这个问题,你可能会在继承类中重写status()方法,更好的解决方案是PHP 5.3后添加了后期静态绑定的功能。 代码如下: 可见,static::不在指向当前所在的类,实际上,它是在运行中计算的,强制获取最终类的所有属性。 因此,建议,以后不要再使用self::,使用static:: 补充:网友帖1 php的后期静态绑定,怎么解释?下面的这幅图输出是A,C,C 由图的继承关系可知:C彻底包含了B和A。 在看答案结果以前,他细观察发现,三个类里都有同一个名称who()方法。 系统会用最后一个优先级最高,进一步的说,你几乎没法通过C去调用A、B内的who(),只能重改方法,比如添加个getBWho(){echo B::who();} 然后通过C::getBWho();来调用B内的who(); 下面来看运行结果: test只在B中出现,所以结果必然是test()中运行的三个结果:
所以答案为:ACC 代码如下: 输出为:A B B 网友帖2 (还是针对上面图中的代码) 手册不是说得很清楚么 ”后期绑定“的意思是说,static::不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可以称之为”静态绑定“,因为它可以用于(但不限于)静态方法的调用。 #1说的有个小问题 【self::foo(); // 这个self实际上是C类。明白吗? C::test() C继承了B的test()方法】 不准确,self还是B类,但是本身没有覆写foo方法,所以就调用父类A的foo方法。 如果self实际是C类,那你试下self::foo();改成self::who();,应当打印C,但是打印B,这也正是self和static的区别。 输出为:A C B 网友帖3 所以这就回答了楼上的疑问:若是把self::foo(); 改成self::who(),因为self指代B,而B有who方法,所以结果是变成了B 静态调用使用 parent:: 或者 self:: 将转发原始调用信息。 更多关于PHP相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》、《》、《》及《》 希望本文所述对大家PHP程序设计有所帮助。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |