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

【现代PHP专题(六)】类的延迟绑定(latebinding)

时间:2023-03-29 16:45:53 PHP

被static::调用,在运行的瞬间进行绑定操作;父类中有一个方法是latebound的,当子类::调用这个方法时,返回调用子类并开始查找;example1:classHuman{publicstaticfunctionwhoami(){echo'父类的whoami正在执行';}publicstaticfunctionsay(){self::whoami();//子类中没有say方法,在这里找到父类//这里的self指的是父类}publicstaticfunctionsay2(){static::whoami();//子类中没有say2方法,在这里找到父类//但是父类使用static::whoami,//指的是调用你子类自己的whoami方法}}classStuextendsHuman{publicstaticfunctionwhoami(){echo'来自子类的whoami正在执行';}}//whoamifromparentclassisexecutingStu::say();//调用Stu类的say方法,但是Stu类没有say方法,所以发给它的父类查找,之后找到父类,发现父类的say方法调用了self::whoami();此时self中其实有两个whoami方法,但是由于本次调用的环境是在say方法内部的父类中,所以调用的是父类的whoami方法,而不是子类的whoami方法;echoPHP_EOL;//子类中的whoami正在执行Stu::say2();//调用Stu类的say2方法,但是Stu类没有say2方法,所以找它的父类。找到父类say2后,发现父类的say2方法对whoami方法使用静态延迟绑定,此时调用的子类有whoami方法(如果没有,再找父类),于是此时绑定到子类的whoami,所以这里调用了子类的whoami方法;示例2:A类imal{常量年龄=1;公共静态$leg=4;publicstaticfunctioncry(){echo'呼呼
';}publicstaticfunctiont1(){self::cry();echoself::age,'
';echoself::$leg,'
';}publicstaticfunctiont2(){static::cry();echostatic::age,'
';echostatic::$leg,'
';}}classHumanextendsAnimal{publicstatic$leg=2;publicstaticfunctioncry(){echo'哇
';}}classStuextendsHuman{constage=16;publicstaticfunctioncry(){echo'咕咕
';}}Stu::t1();//Woo,1,4/*↑↑:总是找到Animal类,Animal类的t1方法是普通绑定,所以是woo,1,4*/Stu::t2();//哼哼,16,2/*↑↑:一直找Animal类,Animal类的t2方法是延迟绑定,回到Stu类开始找。Stu类有cry方法,所以是嘤嘱,有age属性,所以是16,没有leg属性,再往上找,一直能找到,所以是2*/newstatic()andnewself()self-这是类,这是代码段中的类newself就是实例化这个类;static-PHP5.3只增加了当前类,有点像$this,从堆内存中提取出来,访问当前实例化的类,所以static代表那个类。