【问题标题】:PHP: dynamically get name of a class that extends the current class [duplicate]PHP:动态获取扩展当前类的类的名称[重复]
【发布时间】:2017-09-01 14:29:49
【问题描述】:

我有一个抽象类和一个扩展类:

abstract class MyAbstract {
    public function getName(){echo static::class;}
}

class MyExtends extends MyAbstract {}

我想在调用getName() 时动态获取任何扩展类的名称:

$c = new MyExtends();
echo $c->getName(); // expect: "MyExtends"

这在 PHP 5.6+ (demo) 上运行良好,但我正在处理的项目仅限于 PHP 5.3,我无法改变它。在该版本上,会引发解析错误:

解析错误:语法错误,意外的 T_CLASS,需要 T_STRING 或 T_VARIABLE 或 '$'

所以我将函数修改为:

public function getName(){echo __CLASS__;}

当然,这只是呼应了父名称——MyAbstract,所以它不起作用。我唯一想到的是在每个扩展类中用一个新实现覆盖getName(),但这不能很好地扩展:继承的全部意义在于将公共代码库集中在父级中(当然还有真正的功能不是单线)。

知道如何从 PHP 5.3 中的抽象父类的上下文中动态获取扩展类名吗?

【问题讨论】:

    标签: php php-5.3


    【解决方案1】:

    你可以使用get_class获取类名:

    <?php
    abstract class MyAbstract
    {
        public function getName()
        {
            echo get_class($this);
        }
    }
    
    class MyExtends extends MyAbstract 
    {
    }
    
    $c = new MyExtends();
    echo $c->getName(); // expect: "MyExtends"
    

    演示: https://ideone.com/TtMtZ7

    以上代码应该适用于所有版本(自 5.0.4 起)。

    【讨论】:

    • 谢谢。是的,它按预期工作。请添加文档链接以改进答案:php.net/manual/en/function.get-class.php
    • @BeetleJuice - 链接可用但德语:P - 更改为英文。谢谢。
    • 酷网站(ideone.com);我不知道。
    【解决方案2】:

    也许:

    public function getName(){get_class($this);}
    

    还没有测试过。

    【讨论】:

    • 你的直觉是正确的。它有效
    • 优秀。祝你好运
    猜你喜欢
    • 1970-01-01
    • 2016-12-14
    • 2017-08-15
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 2012-11-16
    相关资源
    最近更新 更多