确定使用parent :: __ construct()的子类;

时间:2012-05-11 12:31:35

标签: php oop

我遇到需要将子类的名称传递回父类以便采取某些操作的情况。

我现在设置的方式是:

class SomeParentClass {

    public function __construct($c = false){
        ...
    }

}

class SomeChildClass extends SomeParentClass {

    public function __construct(){
        parent::__construct(__CLASS__){
            ...
        }
    }

}

这会将子类的名称传递回父级,但如果子级类不执行此操作,则变量$c将保留bool值false

它有效,有道理,但这是最干净的方法吗?有没有办法自动检测哪个子类调用parent::__construct()而不将其作为变量传递?

非常感谢

3 个答案:

答案 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());