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

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

我喜欢 this answer 中提出的想法,允许在 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();

现在我想创建一个派生的 class B,它将使用相同的 "pseudo-constructor",因为它是相同的代码。但是,在这种情况下,当我不编写 create() 方法时,self 常量是 class A,因此变量 $aa$bb属于classA,而我希望$bb是classB.

如果我使用 $this 特殊变量,这当然会是 class B,即使在 A 范围内,如果我从 B.

我知道我可以复制整个 create() 方法(也许 Traits 有帮助?),但我还必须复制所有 "constructors"(所有 create* 方法),这是傻

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

您要使用 static,它代表 class,其中 调用了 方法。 (self代表class,其中方法定义。)

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

请参阅 Late Static Bindings 上的文档。

您需要 PHP 5.3+ 才能使用它。