classA{publicstatic$name="I'mA!";publicfunctionselfName(){echoself::$name;}publicfunctionstaticName(){echostatic::$name;}}classBextendsA{publicstatic$name="I'mB!";}$b=newB();$b->selfName();//I'mA!$b->staticName();//I'mB!classCextendsA{publicstatic$name="I'mC!";publicfunctionselfName(){echoself::$name;}}$c=newC();$c->selfName();//I'mC!$c->staticName();//I'mC!

通过这个大略的例子,我们可以看出两点:

self写在哪个类里面,它固定指向的便是当前的这个类static便是哪个工具调用它,它指向的便是这个调用者

代码中我们可以看出,B类没有重写selfName()方法,以是B类调用selfName()时调用的是父类A的selfName()方法,self在这个方法中指向的是A类。
而C类重写了父类的selfName()方法,在调用C类的selfName()时,这里面的self指向的便是C类自己了。

static就比较大略了,例子中都是由B类和C类来调用的A类的staticName()方法,根据谁调用就指向谁来看,输出的结果符合我们的预期,B类工具指向的是B类,C类工具指向的是C类。

phpstaticself再谈PHP中的self与static Bootstrap

我们也可以转而理解为self是个常量,写在哪里就不会变了,它便是指明当前这个类。
而static是个变量,哪个类用到它了它就被赋值成调用它的这个类。

测试代码: https://github.com/zhangyue0503/dev-blog/blob/master/php/201912/source/%E5%86%8D%E8%B0%88PHP%E4%B8%AD%E7%9A%84self%E4%B8%8Estatic.php

参考文档: https://www.cnblogs.com/mr-amazing/p/5953227.html https://www.php.net/manual/zh/language.oop5.constants.php