我正在尝试子类化使用单例模式的类,并使用子类填充实例。
我似乎遇到了一些麻烦。
class Singleton {
static private $instance;
static public function instance(){
if(is_null(self::$instance)){
self::$instance = new self();
}
return self::$instance;
}
private function __construct(){}
}
class MySingleton extends Singleton {
}
echo get_class(MySingleton::instance()); //=> Singleton
//=> I'm hoping to see MySingleton
答案 0 :(得分:8)
您正在寻找的是late static binding这是PHP 5.3的新功能。尝试将new self()
替换为new static()
,这应该适合您。
self
始终引用包含的类,而static
引用“被调用的”类。
答案 1 :(得分:1)
您的单例基类可以防止它原样。如果您将代码更改为此,它将起作用。
<?php
class Singleton {
static private $instances = array();
static public function instance(){
$class = get_called_class();
if(!isset(self::$instances[$class])){
self::$instances[$class] = new $class();
}
return self::$instances[$class];
}
private function __construct(){}
}
class MySingleton extends Singleton {
}
echo get_class(MySingleton::instance()); //=> MySingleton
现在它可以工作,因为Singleton允许每个子类一个实例。
答案 2 :(得分:1)
这是有效的
<?php
class Singleton {
static private $instance;
static public function instance(){
static $instance = null;
return $instance ?: $instance = new static;
}
public function __construct(){}
}
class MySingleton extends Singleton {
}
但我推荐以下一个:
<?php
class Singleton {
static protected $instance; //should not be private
static public function instance(){
if(is_null(static::$instance)){
static::$instance = new static();
}
return static::$instance;
}
public function __construct(){}
}
class MySingleton extends Singleton {
static protected $instance; //must explicitly declared
}