2010-08-02 14 views
7

Chcę mieć metodę statyczną w klasie nadrzędnej, która tworzy wystąpienia dowolnej podklasy, którą nazywam tą metodą.PHP: wywołanie konstruktora podrzędnego z metody statycznej w obiekcie macierzystym

Przykładem aby to bardziej jasne:

 
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

Czy nie brakuje 'extends'? Poza tym nie bardzo rozumiem, co chcesz robić. Czy możesz podać bardziej charakterystyczny przykład tego, co zwraca 'make_objects'? –

+0

Tak, brakuje mi przedłużenia. Będzie baza danych z niezliczonymi wpisami reprezentującymi instancje podklasy, a metoda make_objects będzie zwracać pewne podzbiory tych instancji na podstawie danych warunków. basiccaly próbuję stworzyć coś takiego jak narzędzie ORM, ale z pewnymi specyficznymi funkcjami, których potrzebuję do projektu. – martijnve

Odpowiedz

8

od PHP 5.3 można użyć słowa kluczowego static tego

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

wydruki

object(A)#1 (0) { 
} 
object(B)#2 (0) { 
} 
object(C)#1 (0) { 
} 

edit: inny (podobny) przykład

<?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"; 
} 

drukuje

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

Rozumiem, że chce tworzyć instancje w zależności od typu, który ma w swojej bazie danych. To też mu ​​nie pomoże. –

+0

Może to pytanie jest trochę niejasne. Zobaczymy. – VolkerK

+0

nie chcę tworzyć instancji sub, ale dla linii w mojej bazie danych, więc to jest odpowiedź, na którą liczyłem. Chcemy to przetestować teraz. – martijnve

0

Umm, nie byłoby to:

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

oh widzę, że zapomniałem rozszerzeń w moim przykładowym kodzie. ale nie. obiekty make są długie i kompilują się, a istnieje wiele podklas obiektów nadrzędnych, więc umieszczenie całej metody w każdej podklasie jest wysoce niepożądane (chociaż może się okazać, że jest to jedyna opcja). – martijnve

1

Myślę, że chcesz coś takiego:

class parent { 
    public static function make_object($conditionns) { 
    if($conditions == "case1") { 
     return new sub(); 
    } 
    } 
} 

class sub extends parent { 

} 

Teraz można utworzyć instancję tak:

$instance = parent::make_object("case1"); 

lub

$instance = sub::make_object("case1"); 

Ale dlaczego chcesz wszystkie klasy podrzędne przedłużyć rodzicem? Czy nie powinieneś raczej mieć rodzica dla swoich modeli (podklasy), a następnie klasę fabryczną, która tworzy instancje dla tych modeli w zależności od podanych warunków?

+0

Fabryka to bardzo dobry pomysł. – Sven

-1

uczynić klasa dominująca klasa abstrakcyjna i sprawiają, że metoda również rodzic streszczenie

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

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

Gdzie jest statyczny? – Sven

Powiązane problemy