Попытка использовать объекты, которые расширяют синглетон, но что-то я не могу сделать.
Как вызвать метод из расширенного класса?
Как показать 13 не 12 с синглтоном?
class SingletonTest
{
protected static $_instance;
private function __construct(){}
private function __clone(){}
public static function getInstance() {
if (null === self::$_instance) {
self::$_instance = new self();
}
return self::$_instance;
}
public function test2(){
return 12;
}
}class ExtendSingleton extends SingletonTest
{
public function test2() {
return 13;
}
}$b = ExtendSingleton::getInstance();
echo $b->test2(); //12
Вы получите то, что хотите, если будете использовать ключевое слово static «static» вместо «self»
class SingletonTest
{
protected static $_instance;
private function __construct(){}
private function __clone(){}
public static function getInstance() {
if (null === static::$_instance) {
static::$_instance = new static();
}
return static::$_instance;
}
public function test2(){
return 12;
}
}class ExtendSingleton extends SingletonTest
{
public function test2() {
return 13;
}
}$b = ExtendSingleton::getInstance();
echo $b->test2(); //13
$a = SingletonTest::getInstance();
echo $a->test2(); //13
exit;
Но, как вы видите в приведенном выше примере, таким образом будет создан класс, который вы сначала вызовете для getInstance, чтобы сохранить его экземпляр в поле $ _instance.
Невозможно создать базовый класс синглетона и наследовать поведение синглетона.
public static function getInstance()
{
static $instances = array();
$calledClass = get_called_class();
if (!isset($instances[$calledClass]))
{
$instances[$calledClass] = new $calledClass();
}
return $instances[$calledClass];
}
Так что это должно работать для вас:
(Итак, сначала обычно функции являются общедоступными, поэтому вы можете использовать их, если вы расширяете класс из другого класса! И вы должны сделать объект из ExtendSingleton
не из SingletonTest
поскольку ExtendSingleton
Exdend’s -> SingletonTest
и не наоборот.)
<?php
class SingletonTest {
protected static $_instance;
public function __construct() {
}
public function __clone() {
}
public static function getInstance() {
if (null === self::$_instance) {
self::$_instance = new self();
}
return self::$_instance;
}
public function test2(){
return 12;
}
}class ExtendSingleton extends SingletonTest {
public function test2() {
return 13;
}
}$b = new ExtendSingleton();
echo $b->test2(); //13?>
Выход:
13
Я проверил решение Биккио, и оно работает
class SingletonTest
{
protected static $_instances = [];
private function __construct(){}
private function __clone(){}
public static function getInstance()
{
$calledClass = get_called_class();
if (!isset(self::$_instances[$calledClass]))
{
self::$_instances[$calledClass] = new $calledClass();
}
return self::$_instances[$calledClass];
}
public function test2(){
return 12;
}
}class ExtendSingleton extends SingletonTest
{
public function test2() {
return 13;
}
}$b = ExtendSingleton::getInstance();
echo $b->test2(); //13
$a = SingletonTest::getInstance();
echo $a->test2(); //12
Вы можете расширить синглтон-класс в php, используя позднюю статическую привязку, весь процесс хорошо обсуждается в этом вопросе.