当前位置: 首页 > 后端技术 > PHP

PHP后期静态绑定(LateStaticBindings)

时间:2023-03-29 18:55:37 PHP

后缀的使用后期静态绑定就是static::在类中的用法,首先需要明确,static::后面可以跟类常量,静态属性(类变量)、静态方法和普通方法(static表示类有类常量/静态属性/静态方法,static表示对象有普通方法),不能和普通属性(对象的成员变量)关联,因为语义无法区分是普通属性还是静态属性(语法为static::$xx)。引入的目的引入后期静态绑定的目的是为了打破self::关键字的限制。self在类中的指向决定了编译时self在代码上下文中所处的类。而static::在运行时确定它的指向。在继承关系中,可以看到self和static的区别。使用场景static::和类常量classA{publicconstFOO='a';publicfunctiontest(){echoself::FOO;//self在代码上下文中明确指向类A,即使被子类调用,self也指向A}}classBextendsA{publicconstFOO='b';}(newB)->测试();//输出类A{publicconstFOO='a';publicfunctiontest(){echostatic::FOO;//static在编译阶段不确定方向,运行时确定方向,指向调用者,所以称为`后期绑定`。这里static后面是类常量,所以static代表调用类,也就是B类。}}classBextendsA{publicconstFOO='b';}(newB)->test();//输出bstatic::与静态属性相同(类似地)classA{publicstatic$foo='a';publicstaticfunctiontest(){echoself::$foo;}}B类扩展A{publicstatic$foo='b';}B::test();//输出类A{publicstatic$foo='a';publicstaticfunctiontest(){echostatic::$foo;}}B类扩展A{publicstatic$foo='b';}B::test();//输出bstatic::ScenariowithstaticmethodclassA{publicstaticfunctionwho(){echo__CLASS__;//__CLASS__在编译时绑定到类A名称}publicstaticfunctiontest(){self::who();//self在编译时它指向类A}}classBextendsA{publicstaticfunctionwho(){echo__CLASS__;//__CLASS__在编译期间绑定到类B名称}}B::test();//AclassA{publicstaticfunctionwho(){echo__CLASS__;}publicstaticfunctiontest(){static::who();//后期绑定}}classBextendsA{publicstaticfunctionwho(){回声__CLASS__;}}B::测试();//除了在Bstatic::和普通方法场景中替换self::之外,static::在某些场景下还可以替换$this->有这样一个场景:当父类中的方法被调用时子类,方法中的$this->会先在其作用域(代码上下文,即父类)中寻找私有方法或属性,如果找不到,则调用其子类或属性的方法.而static属于后期绑定,可以绕过这一步,直接指向方法的调用者。A类{私有函数foo(){echo"a\n";}publicfunctiontest(){$this->foo();//作用域中有私有方法foo,所以B中的foo不会被调用方法}}classBextendsA{publicfunctionfoo(){echo"b\n";}}(新B)->测试();//输出aclassA{privatefunctionfoo(){echo"a\n";}publicfunctiontest(){static::foo();//绕过检查,直接调用调用者的方法}}classBextendsA{publicfunctionfoo(){echo"b\n";}}(新B)->测试();//输出b