我遇到需要将子类的名称传递回父类以便采取某些操作的情况。
我现在设置的方式是:
class SomeParentClass {
public function __construct($c = false){
...
}
}
class SomeChildClass extends SomeParentClass {
public function __construct(){
parent::__construct(__CLASS__){
...
}
}
}
这会将子类的名称传递回父级,但如果子级类不执行此操作,则变量$c
将保留bool值false
。
它有效,有道理,但这是最干净的方法吗?有没有办法自动检测哪个子类调用parent::__construct()
而不将其作为变量传递?
非常感谢
答案 0 :(得分:2)
您可以在PHP 5中使用get_called_class()(http://php.net/manual/en/function.get-called-class.php)执行此操作。
请参阅:Getting the name of a child class in the parent class (static context)
答案 1 :(得分:2)
<?php
class SomeParentClass {
public function __construct($c = false){
echo get_called_class();
}
}
class SomeChildClass extends SomeParentClass {
public function __construct(){
parent::__construct(__CLASS__);
}
}
class OtherChildClass extends SomeParentClass {
public function __construct(){
parent::__construct(__CLASS__);
}
}
$a = new SomeChildClass();
$b = new OtherChildClass();
答案 2 :(得分:1)
我可能是错的,但在正常情况下,父母不应该知道它的子类。我确信有更好的方法来做你想做的事。
此“规则”的例外可能是暴露静态(可选最终)构造函数的基类,然后使用前缀的子类调用这些构造函数,例如。
class Parent
{
public final static function create()
{
return new static;
}
}
class Child extends Parent
{
public function __construct()
{
// special code here
}
}
var_dump(Child::create());