; new self(), , new A(). get_called_class(), B.
abstract class A {
static protected $instance = null;
abstract protected function __construct();
static public function getInstance() {
if (is_null(self::$instance)) {
$class = get_called_class();
self::$instance = new $class();
}
return self::$instance;
}
}
class B extends A {
protected function __construct() {
echo "constructing B\n";
}
}
var_dump(B::getInstance());
var_dump(B::getInstance());
, , ?
class C extends A {
protected function __construct() {
echo "constructing C\n";
}
}
var_dump(C::getInstance());
var_dump(C::getInstance());
, ! C, B ! , A . .
, !
abstract class A {
static protected $instances = array();
abstract protected function __construct();
static public function getInstance() {
$class = get_called_class();
if (! array_key_exists($class, self::$instances)) {
self::$instances[$class] = new $class();
}
return self::$instances[$class];
}
}
B C ...
class B extends A {
protected function __construct() {
echo "constructing B\n";
}
}
class C extends A {
protected function __construct() {
echo "constructing C\n";
}
}
,
var_dump(B::getInstance()); // constructing B, object(B)
var_dump(B::getInstance()); // object(B)
var_dump(C::getInstance()); // constructing C, object(C)
var_dump(C::getInstance()); // object(C)
, ! , !