什么是后期静态绑定?其实这个我们在之前的文章PHP中的static中已经说过了。今天我们对这个概念的理解还是比较深刻的。首先,我们通过一段代码介绍后期静态绑定的概念:classA{publicstaticfunctionwho(){echo__CLASS__,PHP_EOL;}publicstaticfunctiontest(){self::who();}}classBextendsA{publicstaticfunctionwho(){echo__CLASS__,PHP_EOL;}}B::测试();//在A的这段代码中,我们使用了self关键字,当使用B类调用test()静态方法时,self指向A类的who()方法,所以输出的是A。不要激动,这是正常的静态绑定。self关键字调用什么取决于它定义在哪个类。也就是说,不管怎么继承,用哪个子类调用test()方法,self关键字都会调用类的who()方法A.那么后期静态绑定呢?其实有点像实例化的类对象。每个实例化的对象都调用自己,而不是父类的属性方法。普通的静态调用不是这样,但是现实中我们有这样的需求,像实例化对象一样调用静态属性方法。这时候我们可以使用static关键字来实现后期静态绑定。classC{publicstaticfunctionwho(){echo__CLASS__,PHP_EOL;}publicstaticfunctiontest(){static::who();}}classDextendsC{publicstaticfunctionwho(){echo__CLASS__,PHP_EOL;}D::测试();//当D使用static关键字时,类D调用的test()方法内部调用的who()就是类D本身。官方文档中的定义是这样的:当调用静态方法时,类名就是明确指定的类名(通常在::运算符的左边);当调用非静态方法时,它是对象所属的类。出于语言内部考虑,此功能被命名为“后期静态绑定”。“后期绑定”是指static::不再解析为定义当前方法的类,而是在运行时实际计算。也可以称为“静态绑定”,因为它可以用于(但不限于)静态方法调用。除了self和static关键字,我们还有一个parent关键字。this关键字的意思很明显,调用父类的静态内容。我们同时用三个关键字进行测试:classE{publicstaticfunctionwho(){echo__CLASS__,PHP_EOL;}publicstaticfunctiontest(){self::who();静态::谁();}}classFextendsE{publicstaticfunctionwho(){echo__CLASS__,PHP_EOL;}}classGextendsF{publicstaticfunctionwho(){parent::who();echo__CLASS__,PHP_EOL;}}G::test();//E//F//G最后我们来看两个PHP方法,一个是get_called_class()方法,用于获取当前调用的是哪个类。在静态方法中,可以根据调用方法判断当前类是哪个类,进行其他业务逻辑操作。另一个是forward_static_call()方法,用于调用静态方法。类H{公共静态函数who(){回声__CLASS__。':'。加入(',',func_get_args()),PHP_EOL;}publicstaticfunctiontest(){echoget_called_class(),PHP_EOL;forward_static_call('谁','a','b');//xxx:a,bforward_static_call(['I','who'],'c','d');//I:c,dforward_static_call_array(['H','who'],['e','f']);//H:e,f}}classIextendsH{publicstaticfunctionwho(){echo__CLASS__.':'。join(',',func_get_args()),PHP_EOL;}}functionwho(){echo'xxx:'.join(',',func_get_args()),PHP_EOL;}H::test();//H//xxx:a,b//I:c,d//H:e,fI::test();//I//xxx:a,b//I:c,d//H:e,f注意,如果forward_static_call()没有指定类名,会调用全局方法。forward_static_call_array()是使用数组传递参数。测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/202001/source/%E5%90%8E%E6%9C%9F%E9%9D%99%E6%80%81%E7%BB%91%E5%AE%9A%E5%9C%A8PHP%E4%B8%AD%E7%9A%84%E4%BD%BF%E7%94%A8.php参考文档:https://www.php.net/manual/zh/language.oop5.late-static-bindings.phphttps://www.php.net/manual/zh/function.get-called-class.phphttps://www.php.net/manual/zh/function.forward-static-call.php各媒体平台均可搜索【硬核项目经理】
