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+ 才能使用它。
我喜欢 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+ 才能使用它。