php5.3后静态绑定用法的详细说明
本文说明了php5.3之后静态绑定的用法,分享给大家参考,如下:
原始手册:
从PHP 5.3.0开始,PHP增加了一个叫做后期静态绑定的函数,用来引用继承范围内静态调用的类。
准确地说,后期静态绑定的工作原理是存储最后一个‘非转发调用’的类名。进行静态方法调用时,类名是显式指定的(通常在:3360运算符的左边部分);当进行非静态方法调用时,它是对象所属的类。所谓‘转移呼叫’是指通过以下方式进行的静态呼叫:self:parent:static:和forward_static_call()。可以使用get_called_class()函数获取被调用方法的类名,static:表示其作用域。
从内部语言的角度来看,这个函数被命名为“后期静态绑定”。“后期绑定”意味着static:不再解析为定义当前方法所在的类,而是在实际运行时计算。它也可以称为“静态绑定”,因为它可以用于(但不限于)调用静态方法。
自我的局限: 33333633636
根据定义当前方法的类,使用self:或_ _ CLASS _ _作为当前类的静态引用:
示例#1 self:用法
?phpclass A { public static function who(){ echo _ _ CLASS _ _;}公共静态函数测试(){ self : who();}}class B扩展了A { public static function who(){ echo _ _ CLASS _ _;} } b : test();上述例行输出:
A
后期静态绑定的使用后期静态绑定旨在通过引入一个新的关键字来表示运行时最初调用的类,从而绕过限制。简单地说,在上面的例子中,当调用test()时,这个关键字使您能够引用B类而不是A类。最后,决定不引入新的关键词,而是使用保留的静态关键词。
示例#2 static:简单用法
?phpclass A { public static function who(){ echo _ _ CLASS _ _;} public static function test(){ static : who();//后期静态绑定从这里开始}}类b扩展了一个{ public static function who(){ echo _ _ class _ _;} } b : test();上述例行输出:
B
注:在非静态环境中,被调用的类是对象实例所属的类。因为$this-将尝试在同一范围内调用私有方法,static:可能会给出不同的结果。另一个区别是static:只能用于静态属性。
示例#3在非静态环境中使用static:
?phpclass A { private function foo(){ echo '成功!\ n ';}公共函数测试(){ $ this-foo();static : foo();} }类扩展A {/* foo()将被复制到B,因此它的作用域仍然是A,*调用将成功*/} C类扩展A {private function foo() {/*原始方法被替换;新的范围是C */}}$b=新的B();$ b-test();$c=新C();$ c-test();//失败?上述例行输出:
成功了!成功了!成功了!致命错误:从第9行的/tmp/test.php中的上下文“A”调用私有方法C:foo()
Note:的静态绑定将被解析,直到获得完全解析的静态调用。另一方面,如果静态呼叫使用parent:或self:则呼叫信息将被转发。
示例#4转发和不转发呼叫
?PHP class A { public static function foo(){ static : who();} public static function who(){ echo _ _ CLASS _ _。\ n ';} }类扩展了A { public static function test(){ A : foo();parent : foo();self : foo();} public static function who(){ echo _ _ CLASS _ _。\ n ';}}class C扩展了B { public static function who(){ echo _ _ CLASS _ _。\ n ';} } c : test();上述例行输出:
(美)空中管制中心(Air Control Center)
下面的例子分析了如何基于PHP后期的静态绑定函数,解决继承范围内静态调用的问题。
首先看下面的代码:
类Person {公共静态函数status(){ self :3360 getstatus();}受保护的静态函数getStatus(){echo 'Person是活动的';} }类dead扩展了Person {受保护的静态函数getStatus(){ echo ' Person is dead ';} }十二月:3360 status();//Person是活着的显然,结果并不是我们预期的那样,因为self:取决于定义它的类,而不是运行类。要解决这个问题,您可以重写继承类中的status()方法。比较好的解决方案是在PHP 5.3之后增加后期静态绑定的功能。
代码如下:
Person类{公共静态函数status(){ static :3360 getstatus();}受保护的静态函数getStatus(){echo 'Person是活动的';} }类dead扩展了Person {受保护的静态函数getStatus(){ echo ' Person is dead ';} }十二月:3360 status();///Person已故,可以看到static:并没有指向当前类,实际上是在运行的时候计算出来的,强制获取最终类的所有属性。
所以建议以后停用self:使用static:
补充:
网友发帖1
如何解释php后期的静态绑定?下图的输出是A,C,C。
根据图的继承关系,C完全包含B和A。
在看答案之前,他观察到三个类都有同一个名字,who()方法。系统将使用优先级最高的最后一个。再进一步,你很难通过C调用A、B中的who(),只能再次更改方法,比如添加一个getb who(){ echo B :3360 who();}然后传递c :3360 getbwho();在b中调用who();
让我们看看运行结果:
Test只出现在b中,所以结果必须是test()中运行的三个结果:
第一个:直接用静态名称调用A中的静态函数,没有悬念,肯定是A中的第二个:parent:是调用上层的父类,这个问题中是A,A中直接调用static : what();如上所述,这个who()在C中优先级最高,不管它在你的ABC中叫什么位置,只要是static:who(),就一定是定义的最后一个,覆盖效果。如果要调用A,则必须指定A:who()或从范围限制中移除静态。所以这个who()是c: self:who中定义的第三个who,和第二个类似。如果要在b中调用who,必须得到B:who(),因为更高级别的c已经重写了这个方法。如果c里面没有who,那一定是b,以此类推。因此,有必要在c中调用who
所以答案是:ACC
代码如下:
?PHP class A { public static function foo(){ static : who();} public static function who(){ echo _ _ CLASS _ _。\ n ';} }类扩展了A { public static function test(){ A : foo();parent : foo();self : foo();} public static function who(){ echo _ _ CLASS _ _。\ n ';}}class C扩展了B {//公共静态函数who() { //echo __CLASS__。\ n ';//} } c :3360 test();输出为:甲乙
网友发帖2
(或上图中的代码)
说明书不是很清楚吗
“后期绑定”意味着static:不再解析为定义当前方法所在的类,而是在实际运行时计算。它也可以被称为“静态绑定”,因为它可以用于(但不限于)静态方法的调用。
#1表示有一个小问题
【self : foo();//这个自我其实就是C类.明白吗?C:test() C继承了B]的test()方法
不准确,self还是b类,但是没有覆盖foo方法,所以调用父类a的foo方法。
如果self实际上是C类,那么试试self : foo();给自己: who();应该打印c,但打印b,这是自我和静态的区别。
?PHP class A { public static function foo(){ static : who();} public static function who(){ echo _ _ CLASS _ _。\ n ';} }类扩展了A { public static function test(){ A : foo();parent : foo();self : who();} public static function who(){ echo _ _ CLASS _ _。\ n ';}}class C扩展了B { public static function who(){ echo _ _ CLASS _ _。\ n ';} } c : test();输出为:交流
网友发帖3
a : FOo();//A指A类,访问A类的foo方法和who方法parent : foo();//调用b类的父类——A的foo方法,告诉foo方法原来的调用者是cself : foo();//self指的是定义这个方法的类,也就是b,但是b没有定义foo方法,将原来的调用者c向上传递,//访问父类的foo方法,最后访问c的who方法;所以这回答了楼上的问题:如果你把self : foo();改为self:who(),因为self指b,b有who方法,所以结果变成b
使用parent:或self:的静态呼叫将转发原始呼叫信息。
更多对PHP相关内容感兴趣的读者可以查看本网站的话题:《php面向对象程序设计入门教程》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《PHP网络编程技巧总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》、《php常见数据库操作技巧汇总》、0103010。
希望本文对PHP编程有所帮助。
版权声明:php5.3后静态绑定用法的详细说明是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。