[英]PHP: call child constructor from static method in parent
我希望在父類中有一個靜態方法,它創建我調用此方法的子類的實例。
舉個例子來說明這一點:
class parent { public static method make_objects($conditions){ for (...){ // here i want to create an instance // of whatever subclass i am calling make_objects on // based on certain $conditions } } } class sub extends parent{ ... } $objects = sub::make_objects($some_conditions);
從php 5.3開始,您可以使用static關鍵字
<?php
class A {
public static function newInstance() {
$rv = new static();
return $rv;
}
}
class B extends A { }
class C extends B { }
$o = A::newInstance(); var_dump($o);
$o = B::newInstance(); var_dump($o);
$o = C::newInstance(); var_dump($o);
版畫
object(A)#1 (0) {
}
object(B)#2 (0) {
}
object(C)#1 (0) {
}
編輯:另一個(類似的)例子
<?php
class A {
public static function newInstance() {
$rv = new static();
return $rv;
}
public function __construct() { echo " A::__construct\n"; }
}
class B extends A {
public function __construct() { echo " B::__construct\n"; }
}
class C extends B {
public function __construct() { echo " C::__construct\n"; }
}
$types = array('A', 'B', 'C');
foreach( $types as $t ) {
echo 't=', $t, "\n";
$o = $t::newInstance();
echo ' type of o=', get_class($o), "\n";
}
版畫
t=A
A::__construct
type of o=A
t=B
B::__construct
type of o=B
t=C
C::__construct
type of o=C
我想你想要這樣的東西:
class parent {
public static function make_object($conditionns) {
if($conditions == "case1") {
return new sub();
}
}
}
class sub extends parent {
}
現在您可以創建一個這樣的實例:
$instance = parent::make_object("case1");
要么
$instance = sub::make_object("case1");
但是為什么你想要所有子類擴展父類? 你不應該更喜歡你的模型(子類)和工廠類的父級,它根據給定的條件為這個模型創建實例嗎?
嗯,不會那樣:
class sub extends parent {
public static function make_objects($conditions) {
//sub specific stuff here
//....
}
}
使父類成為一個抽象類,並使父方法也成為一個抽象類
abstract static class parent {
abstract function make_method() {
// your process
}
}
class child extends parent {
public function __construct() {
parent::make_method();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.