标题:静态成员在PHP中是怎么继承的?

文章目录
    分类:PHP 标签:PHP基础

    静态成员在PHP中是怎么继承的?

    静态成员,也就是用static修饰的变量或者方法,如果搞不清楚它们实现的原理,就很容易会出现一些错误。这次我们来研究的是在继承中静态成员的调用情况。首先来看这样一段代码:

    class A
    {
        static $a = 'This is A!';
    
        public function show()
        {
            echo self::$a, PHP_EOL;
            echo static::$a, PHP_EOL;
        }
    }
    
    class B extends A
    {
        static $a = 'This is B!';
    
    }
    
    $b = new B;
    $b->show();

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

    This is A!
    This is B!

    好了,有了这个基础之后,我们知道静态成员是和类有关的,和对象无关。那么以下的代码也就更容易理解了。

    class C
    {
        static $c = 1;
        public $d = 1;
    }
    class D extends C
    {
        public function add()
        {
            self::$c++;
            $this->d++;
        }
    }
    
    $d1 = new D();
    $d2 = new D();
    
    $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作为普通变量,它的作用域仅限制在当前这个实例对象中。因此,输出的结果是:

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

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

    class E {
        public static function test(){
            echo "This is E test!";
        }
    }
    
    class F extends E{
        public static function t(){
            self::test();
            parent::test();
            static::test();
        }
    
        public static function test(){
            echo "This is F test!";
        }
    }
    
    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

    视频链接

    B站视频地址:https://www.bilibili.com/video/BV1Lz4y1f7he

    微信视频地址:http://mp.weixin.qq.com/s?__biz=MzIxODQyNTU1MA==&mid=2247484764&idx=1&sn=820620ca33b8e3e970a8faaeaf8661bd&chksm=97ebf4fda09c7deb03b13868750b019be33bc3ed71061772431ba69aac0997e653e96ae860ec&scene=27#wechat_redirect

    微信文章地址:http://mp.weixin.qq.com/s?__biz=MzIxODQyNTU1MA==&mid=2247484355&idx=1&sn=5e5966962a807c246d63187166f33ed8&chksm=97ebf262a09c7b7493e9b6644c42f63b469c3bc4127c277801cbc73b59061ba38869e686e6dc&scene=27#wechat_redirect

    搜索
    关注