2017-09-01 113 views
2

我有一个抽象类,延伸类的类名:PHP:动态得到扩展当前类

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,我没有杠杆来改变这种状况。在该版本中,一个解析错误被抛出:

Parse error: syntax error, unexpected T_CLASS, expecting T_STRING or T_VARIABLE or '$'

所以我修改的功能:

public function getName(){echo __CLASS__;} 

当然,这只是呼应了父母的名字 - MyAbstract,所以这是行不通的。我唯一想到的是在每个扩展类中用一个新的实现覆盖getName(),但这并不能很好地扩展:整个继承点就是将通用代码集中在父类中(当然,实际功能不是一个班轮)。

任何想法如何从PHP 5.3中的抽象父类的上下文动态获取扩展类名?

回答

2

您可以使用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" 

demo:https://ideone.com/TtMtZ7

上面的代码应该在所有版本(5.0.4以来)。

+1

谢谢。是的,它按预期工作。请添加一个链接到文档,以改善答案:http://php.net/manual/en/function.get-class.php – BeetleJuice

+0

@BeetleJuice - 链接可用,但在德国:P - 改为英文。谢谢。 –

+0

很酷的网站(ideone.com);我不知道这件事。 – BeetleJuice

2

可能:

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

还没虽然进行了测试。

+1

你的直觉是正确的。它的工作原理 – BeetleJuice

+0

非常好。祝你好运 – ASOlivieri