Tutorial :PHP: call child constructor from static method in parent



Question:

I want to have a static method in a parent class that creates instances of whatever subclass i call this method on.

An example to make this more clear:

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


Solution:1

As of php 5.3 you can use the static keyword for this

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

prints

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

edit: another (similar) example

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

prints

t=A   A::__construct    type of o=A  t=B   B::__construct    type of o=B  t=C   C::__construct    type of o=C  


Solution:2

I think you want something like this:

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

Now you can create an instance like this:

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

or

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

But why would you want all the sub classes to extend the parent? Shouldn't you much rather have a parent for your models (sub classes) and then a factory class, that creates the instances for this models depending on the conditions given?


Solution:3

Umm, wouldn't that be:

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


Solution:4

make the parent class an abstract class and make the parent method also an abstract

abstract static class parent {       abstract function make_method() {           // your process       }  }    class child extends parent {       public function __construct() {            parent::make_method();       }  }  

Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Previous
Next Post »