As in php 5.3, you can use static to do 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
Volkerk
source share