2010-08-02 157 views
7

我想在父類中創建一個靜態方法,該方法創建任何我稱之爲此方法的子類的實例。PHP:從父類的靜態方法調用子構造函數

一個例子來說明這更加明確:

 
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); 
+0

你是不是缺少'extends'?另外,我不太明白你想做什麼。你能給出一個關於'make_objects'返回的更有說服力的例子嗎? – 2010-08-02 20:40:19

+0

是的,我錯過了延伸。 將會有一個數據庫有無數條表示子類實例的條目,並且make_objects方法會根據給定的條件返回這些實例的某些子集。 basiccaly即時嘗試創建類似於orm工具,但具有一些特定功能,我需要一個項目。 – martijnve 2010-08-02 20:51:36

回答

8

由於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 
+0

但是,我瞭解他,他希望根據他在數據庫中的類型創建實例。所以這也無濟於事。 – 2010-08-02 21:01:08

+0

也許,這個問題有點含糊。我們拭目以待。 – VolkerK 2010-08-02 21:04:52

+0

不,我想創建sub的實例,但爲了我的數據庫中的行,所以它狡猾這是我所希望的答案。現在就去測試它。 – martijnve 2010-08-02 21:06:05

0

嗯,那不是:

class sub extends parent { 
    public static function make_objects($conditions) { 
    //sub specific stuff here 
    //.... 
    } 
} 
+0

哦,我看到我忘記了在我的示例代碼中的擴展。 但沒有。 使對象變得相當長和強大,並且將會有幾十個父類的子類,因此將整個方法放在每個子類中是非常不可取的(儘管它可能是唯一的選擇) – martijnve 2010-08-02 20:49:27

1

我想你想是這樣的:

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"); 

可是爲什麼你想所有的子類繼承父?你不應該爲你的模型(子類)和工廠類有一個父類,它根據給定的條件爲這個模型創建實例嗎?

+0

工廠是一個非常好的主意。 – Sven 2012-10-19 22:29:42

-1

使父類的抽象類,讓父類的方法也是抽象

abstract static class parent { 
    abstract function make_method() { 
     // your process 
    } 
} 

class child extends parent { 
    public function __construct() { 
      parent::make_method(); 
    } 
} 
+0

靜態在哪裏? – Sven 2012-10-19 22:27:51

相關問題