singleton — PHP Как вызвать метод из расширенного класса

Попытка использовать объекты, которые расширяют синглетон, но что-то я не могу сделать.
Как вызвать метод из расширенного класса?

Как показать 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

0

Решение

Вы получите то, что хотите, если будете использовать ключевое слово 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.

Невозможно создать базовый класс синглетона и наследовать поведение синглетона.

1

Другие решения

public static function getInstance()
{
static $instances = array();

$calledClass = get_called_class();

if (!isset($instances[$calledClass]))
{
$instances[$calledClass] = new $calledClass();
}

return $instances[$calledClass];
}
1

Так что это должно работать для вас:

(Итак, сначала обычно функции являются общедоступными, поэтому вы можете использовать их, если вы расширяете класс из другого класса! И вы должны сделать объект из 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
0

Я проверил решение Биккио, и оно работает

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
0

Вы можете расширить синглтон-класс в php, используя позднюю статическую привязку, весь процесс хорошо обсуждается в этом вопросе.

Создание шаблона проектирования Singleton в PHP5

0
По вопросам рекламы [email protected]