2010-08-02 5 views
7

Je veux avoir une méthode statique dans une classe parente qui crée des instances de n'importe quelle sous-classe sur laquelle j'appelle cette méthode.PHP: appel du constructeur enfant de la méthode statique dans le parent

Un exemple pour le rendre plus clair:

 
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

N'êtes-vous pas un manque 'extends'? De plus, je ne comprends pas vraiment ce que tu veux faire. Pouvez-vous donner un exemple plus parlant de ce que renvoie 'make_objects'? –

+0

Oui, il me manque un étend. Il va y avoir une base de données avec d'innombrables entrées représentant des instances de sous-classes et la méthode make_objects devrait renvoyer certains sous-ensembles de ces instances en fonction de conditions données. J'essaie de créer quelque chose comme un outil orm mais avec certaines fonctionnalités spécifiques dont j'ai besoin pour un projet. – martijnve

Répondre

8

PHP 5.3, vous pouvez utiliser le mot-clé static pour cette

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

estampes

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

edit: un autre (similaire) exemple

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

impressions

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

Je le comprends, il veut créer des instances en fonction du type qu'il a dans sa base de données. Donc, cela ne l'aiderait pas non plus. –

+0

Peut-être, la question est un peu vague. Nous verrons. – VolkerK

+0

Non, je veux créer des instances de sous-lignes, mais pour les lignes dans ma base de données, donc c'est une réponse que j'espérais. Va le tester maintenant. – martijnve

0

Umm, ce ne serait pas:

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

oh je vois j'ai oublié le étend dans mon exemple de code. mais pas. les objets make doivent être assez longs et compex et il y aura des dizaines de sous-classes de parent, donc mettre toute la méthode dans chaque sous-classe est hautement indésirable (bien que cela puisse être la seule option) – martijnve

1

Je pense que vous voulez quelque chose comme ceci:

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

class sub extends parent { 

} 

Maintenant, vous pouvez créer une instance comme ceci:

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

ou

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

Mais pourquoi voudriez-vous toutes les sous classes pour étendre le parent? Ne devriez-vous pas plutôt avoir un parent pour vos modèles (sous-classes) et ensuite une classe d'usine, qui crée les instances pour ces modèles en fonction des conditions données?

+0

L'usine est une très bonne idée. – Sven

-1

faire la classe parente d'une classe abstraite et rendre la méthode mère aussi un résumé

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

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

Où est le statique? – Sven

Questions connexes