在静态绑定使用PHP5.3的详细解释
本文阐述了静态绑定使用供你参考你php5.3.share后,如下:手册原文:
从PHP 5.3.0,PHP已经添加了一个名为静态绑定引用在继承范围静态调用类的函数。
要精确,后期静态绑定的原理是存储最后一非转发呼叫类的名字。当一个静态方法时,类的名字是指定一个(通常是在::操作者的左半部分);当一个非静态方法被调用时,它是类的对象属于。所谓的呼叫转移是指静态调用方式如下:::::自母静::forward_static_call(),get_called_class()函数是用来获取调用方法,静态类的名字::其范围是指出。
此功能称为静态绑定从语言内部的角度。后期绑定意味着静:不再解释为一个类定义了当前的方法计算,但在实际运行中,它也被称为静态绑定因为它可用于(但不限于)从静态方法调用。
自我:限制
使用自::或__class__静态引用当前类取决于当前方法的类定义:
例1:使用#自我:
< PHP
类{
公共静态函数谁(){
回声__class__;
}
公共静态函数测试(){
自我:谁();
}
}
B类扩展{
公共静态函数谁(){
回声__class__;
}
}
B::测试();
>
上述例程将输出:
一
后来的后来的静态绑定静态绑定的目的是绕过限制,通过引入一个新的关键词代表一类在运行时,在一个简单的方法,这个关键字可以使你指的是当您呼叫测试()在上面的例子中是B不是A的最终决定不引进一个新的关键词,而是使用保留关键字。
例2:使用简单的静态:#
< PHP
类{
公共静态函数谁(){
回声__class__;
}
公共静态函数测试(){
静态::(谁);延迟静态绑定从这里开始
}
}
B类扩展{
公共静态函数谁(){
回声__class__;
}
}
B::测试();
>
上述例程将输出:
B
注意:在非静态环境中,所调用的类是对象实例所属的类。因为$试图在同一范围内调用私有方法,静态::它可以给出不同的结果。另一个区别是静态的:它只能用于静态属性。
3例#采用静态:在非静态环境。
< PHP
类{
私有函数富(){
成功!;
}
公共功能测试(){
$ $ >富();
静态:;
}
}
B类扩展{
将要复制到B,因此它的作用域仍然是a和
*调用是成功的
}
类C扩展{
私有函数富(){
原来的方法被替换为新的范围;一个是C.。
}
}
新的b();
测试();
新的C();
测试();失败
>
上述例程将输出:
成功!
成功!
成功!
致命错误:调用私有方法C::foo()从context'a'in
在注释的后期阶段,静态绑定的解析将继续进行,直到完全解析静态调用。另一方面,如果静态调用使用父::或::向前调用信息。
4例#向前和非转移呼叫
< PHP
类{
公共静态函数富(){
静态::谁();
}
公共静态函数谁(){
回声__class__。;
}
}
B类扩展{
公共静态函数测试(){
A::();
父::();
自;
}
公共静态函数谁(){
回声__class__。;
}
}
类C扩展B {
公共静态函数谁(){
回声__class__。;
}
}
C::测试();
>
上述例程将输出:
一
C
C
下面的示例分析基于PHP的后期静态绑定函数来解决继承范围内的静态调用的类。
首先看看下面的代码:
班上的人
{
公共静态函数状态()
{
自::getStatus();
}
保护静态函数getStatus()
{
回声人活着;
}
}
类死延人
{
保护静态函数getStatus()
{
回音人死了;
}
}
死者::状态();
显然,结果并不是我们所期望的,因为自我依赖于它定义的类,而不是运行中的类。要解决这个问题,您可以重写继承类中的状态()方法,更好的解决方案是在PHP 5.3之后添加静态绑定函数。
代码如下:
班上的人
{
公共静态函数状态()
{
静态::getStatus();
}
保护静态函数getStatus()
{
回声人活着;
}
}
类死延人
{
保护静态函数getStatus()
{
回音人死了;
}
}
死者::状态();
可见,静态::不指向当前类,事实上,它是在运行中计算的,强制最后类的所有属性。
因此,建议你不要使用自我:再次使用静态::
补充:
网友1
对PHP后期静态绑定的解释是什么下面的图输出是a,c,c
从图的继承关系知道:C完全包含B和A。
在看答案之前,他注意到在三个类中有相同的名字谁()方法。
系统将使用最高优先级的最后一个优先级。此外,你也很难叫人()A和B通过你只能重新修改的方法,如添加getbwho(){ echo B::谁(});}
然后通过C::getbwho();(B)在给谁打电话;
下面是运行结果:
测试只出现在B中,所以结果必须是三个在测试中运行的结果:
第一种:静态直接名称到名称的调用静态函数,这是没有悬念的,它必须是
第二:父级:是调用父级的级别,A在这个问题上,A也直接调用静态:谁();如上所述,谁(C)在C中的最高优先级,不管你在ABC调用哪个,只要它是静态的:谁()必须是最后一个。覆盖效应的定义,如果需要指定A:调用A:谁(静态),或者去掉范围限制来实现。
第三个问题是:自我:谁和第二个类似问题。当我们去B时,我们应该注意覆盖效果。如果我们想打电话给B,我们必须得到B:谁(),因为更高级的C重写了这个方法。如果C中没有谁,它必须是B,因此,有必要调用C中的谁;
所以答案是:ACC
代码如下:
< PHP
类{
公共静态函数富(){
静态::谁();
}
公共静态函数谁(){
回声__class__。;
}
}
B类扩展{
公共静态函数测试(){
A::();
父::();
自;
}
公共静态函数谁(){
回声__class__。;
}
}
类C扩展B {
公共静态函数谁(){
__class__。;
/