文章大纲

php延迟静态绑定的简单理解

2020-02-19 21:22:15

首先我们来了解下php里的“延迟静态绑定”指的是怎么一回事儿。


php在线手册里有说明的例子,翟码农就直接粘贴过来啦,额外加了一行echo语句,如下所示:

<?php
//代码片段1
class A {
    public static function who() {
        echo "in A<br>";  //新添加的
        echo __CLASS__;
    }
    public static function test() {
        self::who();
    }
}

class B extends A {
    public static function who() {
        echo "in B<br>";  //新添加的
        echo __CLASS__;
    }
}

B::test();
?>

上面示例代码结果:

in A
A


明明是B类调用的test方法,为何运行的却是A类里的who方法呢?


上面问题我们暂时放在一边,先来看看在上面示例代码的基础上稍稍修改后的代码:

<?php
//代码片段2
class A {
    public static function who() {
        echo "in A<br>";
        echo __CLASS__;
    }
    public static function test() {
        static::who();  //此处self改为static了
    }
}

class B extends A {
    public static function who() {
        echo "in B<br>";
        echo __CLASS__;
    }
}

B::test();
?>

此时代码执行结果就变为:

in B
B


上面A类里用static关键字调用who方法,就是本文要讲的PHP“延迟静态绑定”。


以前没怎么深究这个名称,今天我稍微揣摩了一下,跟大家分享一下。


关键就在于“延迟”两字的理解上。


一般高级语言程序的执行,是先编译后执行。对于php这种脚本语言的执行,同样也是如此。关于php脚本具体的执行流程,翟码农打算以后再专门学习学习,本文就暂时不拓展了。


代码片段1里,由于self关键字是在A类里,在编译阶段,就已经将self解释成A类,所以调用的也是A类里的who方法。上面问题的答案,这里就已经给出来了。


可在代码片段2里,用了static关键字后,编译阶段就会对static的指向暂时“延迟”了,直到执行编译后的程序时,即执行B::test()这段代码时,才将static关键字绑定到了这里的调用test方法的B类上。


self的绑定,在编译阶段就确定了。而static的绑定,在执行阶段才确定,这就是名称里“延迟”的由来。

延迟的解释:self的绑定,在编译阶段就确定了。而static的绑定,在执行阶段才确定,这就是名称里“延迟”的由来。


了解了延迟静态绑定是怎么一回事,也理解了延迟的意义,那么在写程序时,什么场景中会用到此种情况呢?


通过上面代码片段,至少可以理解,当想要在父类里调用子类里方法时,就可以用到的。








我要评论
评论列表