0

我有一种情况,我需要将子类的名称传递回父类才能采取一些措施。

我目前设置的方式是:

class SomeParentClass {

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

}

class SomeChildClass extends SomeParentClass {

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

}

这会将子类的名称传递回父类,但如果子类不这样做,则变量$c将保留 bool 值false

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

非常感谢

4

3 回答 3

2

您可以使用PHP 5 中的 get_call_class() ( http://php.net/manual/en/function.get-called-class.php ) 来完成此操作。

请参阅:获取父类中子类的名称(静态上下文)

于 2012-05-11T12:34:24.237 回答
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();
于 2012-05-11T12:39:18.690 回答
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());
于 2012-05-11T12:40:30.687 回答