php中继承Static与延迟绑定

发布于 2022-09-11 22:30:52 字数 2220 浏览 19 评论 0

题目描述

<?php
declare(strict_types=1);

class staticparent {
    static    $parent_only;
    static    $both_distinct;
    
    function __construct() {
        static::$parent_only = 'fromparent';
        static::$both_distinct = 'fromparent';
        //self::$parent_only = 'fromparent';
       // self::$both_distinct = 'fromparent';
    }
}

class staticchild extends staticparent {
    static    $child_only;
    static    $both_distinct;
    
    function __construct() {
        static::$parent_only = 'fromchild';
        static::$both_distinct = 'fromchild';
        static::$child_only = 'fromchild';
       // self::$parent_only = 'fromchild';
       // self::$both_distinct = 'fromchild';
       // self::$child_only = 'fromchild';
    }
}

$a = new staticparent;
$a = new staticchild;

echo 'Parent: parent_only=', staticparent::$parent_only, ', both_distinct=', staticparent::$both_distinct, "<br/>\r\n";
echo 'Child:  parent_only=', staticchild::$parent_only, ', both_distinct=', staticchild::$both_distinct, ', child_only=', staticchild::$child_only, "<br/>\r\n";
?>

题目来源及自己的思路

输出

Parent: parent_only=fromchild, both_distinct=fromparent
Child: parent_only=fromchild, both_distinct=fromchild, child_only=fromchild

https://www.php.net/manual/zh...

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)

$a = new staticparent;
var_dump(get_class_vars("staticparent"));
$a = new staticchild;
echo "<hr>";
var_dump(get_class_vars("staticparent"));

出现以下结果

array(2) { ["parent_only"]=> string(10) "fromparent" ["both_distinct"]=> string(10) "fromparent" }
array(2) { ["parent_only"]=> string(9) "fromchild" ["both_distinct"]=> string(10) "fromparent" }

我想咨询下,为什么new staticchild后父类的parent_only会被修改,而both_distinct却不会.
另外输出的原因是什么,而且把注释里面self::打开,替换static,结果为何是一致

Parent: parent_only=fromchild, both_distinct=fromparent
Child: parent_only=fromchild, both_distinct=fromchild, child_only=fromchild

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

北风几吹夏 2022-09-18 22:30:52

因为被覆盖了啊
staticchild没有$parent_only,
所以staticchild::$parent_only调用的是staticparent$parent_only
staticparent$parent_only被设置了fromchild
所以打印出了fromchild

另外静态绑定不是这么用的。

子类继承父类覆盖了a属性。
当子类的一个实例对象调用父类一个获取或使用a属性方法时,一般情况下,使用的是父类的a属性。
而静态绑定,则使用的是子类自身的a属性。
概况起来就是谁的对象用谁的

爱你不解释 2022-09-18 22:30:52

本来写了一些,但是感觉我自己都要被转晕了,可以参考这篇文章。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文