classA{static$a='ThisisA!';publicfunctionshow(){echoself::$a,PHP_EOL;echostatic::$a,PHP_EOL;}}classBextendsA{static$a='ThisisB!';}$b=newB;$b->show();

之前的文章中,我们有说过self的问题。
self仅仅只是指向当前这个类。
把稳,是类,不是实例化后的工具。
以是上面的输出结果是:

ThisisA!ThisisB!

好了,有了这个根本之后,我们知道静态成员是和类有关的,和工具无关。
那么以下的代码也就更随意马虎理解了。

classC{static$c=1;public$d=1;}classDextendsC{publicfunctionadd(){self::$c++;$this->d++;}}$d1=newD();$d2=newD();$d1->add();echo'c:'.D::$c.',d:'.$d1->d.';',PHP_EOL;$d2->add();echo'c:'.D::$c.',d:'.$d2->d.';',PHP_EOL;

直接读代码能推导出输出的结果吗?实在只要节制了上文中所说的原则,这段代码就很随意马虎理解了。
$c是静态变量,$d是普通变量。
通过类实例的add()方法进行操作后,$c由于是和类有关,以是不管是哪个实例工具,操作它之后都会是共享的。
而$d作为普通变量,它的浸染域仅限定在当前这个实例工具中。
因此,输出的结果是:

php静态成员静态成员在PHP中是怎么继续的 RESTful API

c:2,d:2;c:3,d:2;

末了,我们还是来复习一次self、parent和static关键字。

classE{publicstaticfunctiontest(){echo"ThisisEtest!";}}classFextendsE{publicstaticfunctiont(){self::test();parent::test();static::test();}publicstaticfunctiontest(){echo"ThisisFtest!";}}F::t();

t()输出的三个结果是什么呢?详情可以查看之前的文章PHP中的Static

测试代码: https://github.com/zhangyue0503/dev-blog/blob/master/php/201912/source/%E9%9D%99%E6%80%81%E6%88%90%E5%91%98%E5%9C%A8PHP%E4%B8%AD%E6%98%AF%E6%80%8E%E4%B9%88%E7%BB%A7%E6%89%BF%E7%9A%84%EF%BC%9F.php

参考文档: https://www.php.net/manual/zh/language.oop5.static.php