2010-08-02 12 views
7

Quiero tener un método estático en una clase padre que crea instancias de cualquier subclase que llame este método.PHP: llame al constructor hijo desde el método estático en el padre

Un ejemplo para hacer esto más claro:

 
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

¿No estás falta un 'extends'? Además, realmente no entiendo lo que quieres hacer. ¿Puedes dar un ejemplo más revelador sobre qué devuelve 'make_objects'? –

+0

Sí, me falta una extensión. Habrá una base de datos con innumerables entradas que representan instancias de subclases y el método make_objects devolverá ciertos subconjuntos de estas instancias en función de las condiciones dadas. basiccaly Estoy tratando de crear algo así como una herramienta de orm pero con algunas características específicas que necesito para un proyecto. – martijnve

Respuesta

8

A partir de PHP 5.3 se puede utilizar la palabra clave para este 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); 

impresiones

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

edición: otro (similar) ejemplo

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

impresiones

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

Pero como Entiendo que quiere crear instancias dependiendo del tipo que tenga en su base de datos. Entonces esto tampoco lo ayudaría. –

+0

Tal vez, la pregunta es un poco vaga. Ya veremos. – VolkerK

+0

no, quiero crear instancias de sub, pero para líneas en mi base de datos, así que creo que esta es la respuesta que estaba esperando. Voy a probarlo ahora. – martijnve

0

Umm, no que sea:

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

oh veo que olvidé la extensión en mi código de ejemplo. pero no. the make objects va a ser bastante largo y complejo y habrá docenas de subclases de parent por lo que poner el método completo en cada subclase es altamente indeseable (aunque puede ser la única opción) – martijnve

1

creo que quiere algo como esto:

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

class sub extends parent { 

} 

Ahora puede crear una instancia de esta manera:

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

o

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

Pero ¿por qué quieres todas las subclases que se extienden a los padres? ¿No deberías preferir tener un padre para tus modelos (sub clases) y luego una clase de fábrica, que crea las instancias para estos modelos dependiendo de las condiciones dadas?

+0

La fábrica es una muy buena idea. – Sven

-1

crea la clase padre una clase abstracta y hacer que el método padre también un resumen

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

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

¿Dónde está la estática? – Sven

Cuestiones relacionadas