php 关于继承,面向对象 题目
迷茫
迷茫 2017-04-11 10:11:42
[PHP讨论组]

1.网上看到一道题,没答案,自己执行了下,发现和自己想的不一样,新手求解惑
2.代码如下:

class A
{
    public static function foo()
    {
     static::who();
    }
    public static function who(){
        echo __CLASS__;
    }
}
class B extends A{
    public static function test()
    {
        A::foo();
        parent::foo();
        self::foo();
    }
    public static function who(){
        echo __CLASS__;
    }
}
class C extends B{
    public static function who(){
        echo __CLASS__;
    }
}
C::test();

3.输出结果为 ACC,求大神分析解答下

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(2)
黄舟

因为后期静态绑定static是运行时计算的, 它会沿着调用栈向上回溯. 直到找到明确指定的类名.
回到例子, 对它进行简化, 排除掉一些干扰代码:

<?php 

class A
{
    public static function foo()
    {
     static::who();
    }
}
class B extends A{
    public static function test()
    {
        parent::foo();
    }
}
class C extends B{
    public static function who(){
        debug_print_backtrace();
        echo __CLASS__;
    }
}
C::test();

运行到static::who()时, 向上回溯, 发现调用者为parent::foo(), 因为parent是转发调用, 所以继续向上回溯, C::test(), C是明确的类名, 所以计算结果为C.

调用栈信息:

#0  C::who() called at [E:\123.php:7]
#1  A::foo() called at [E:\123.php:13]
#2  B::test() called at [E:\123.php:22]

看栈顶这行信息#0 C::who() called at [E:\123.php:7], static计算出的结果为类名C.

大家讲道理

首先找到继承B的test()方法,先执行A中的foo,foo中又执行who,输出A
然后是parent的foo,相对于C的parent为B,所以又执行B的foo,里面执行static::who , 输出B
最后是执行C中的, 输出C

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号