self ::引用父类的静态方法中的派生类

我喜欢这个答案中提出的想法,允许在PHP中使用多个构造函数。 我有的代码类似于:

class A {
    protected function __construct(){
    // made protected to disallow calling with $aa = new A()
    // in fact, does nothing
    }; 

    static public function create(){
        $instance = new self();
        //... some important code
        return $instance;
    }

    static public function createFromYetAnotherClass(YetAnotherClass $xx){
        // ...
    } 

class B extends A {};

$aa = A::create();
$bb = B::create();

现在我想创建派生类B ,它将使用相同的“伪构造函数”,因为它是相同的代码。 然而,在这种情况下,当我不编写create()方法时, self常量就是A类,所以变量$aa$bb都是AA ,而我希望$bbB类。

如果我使用$this特殊变量,这当然会是类B ,即使在A范围内,如果我调用B任何父类方法。

我知道我可以复制整个create()方法(也许Traits确实有帮助?),但我也必须复制所有“构造函数”(全部create*方法),这很愚蠢。

如何帮助$bb变为B ,即使方法在A上下文中调用?


你想使用static ,它代表调用该方法的类。 ( self表示定义方法的类。)

static public function create(){
    $instance = new static();
    //... some important code
    return $instance;
}

请参阅Late Static Bindings文档。

你需要PHP 5.3+来使用它。

链接地址: http://www.djcxy.com/p/58041.html

上一篇: self:: referring to derived class in static methods of a parent class

下一篇: How to invoke a method statically?