Что такое синглтон в PHP

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

Пока проблем нет, но когда дело доходит до создания одноэлементного класса в PHP, я не знаю, как это работает!

Взгляните на этот пример:

class Foo {
    static function instance() {
        static $inst = null;
        if ($inst === null) {
            $inst = new self;
        }
        return $inst;
    }

    static function google(){
        echo 'google';
    }
    private function __construct() { }
    private function __clone() { }
    private function __wakeup() { }
}

Я пытаюсь сделать 2 экземпляра из этого класса:

$obj = Foo::google();
$obj2 = Foo::google();

echo $obj2;

Вы можете видеть, что $obj и $obj2 - это 2 разных объекта, но этот код работает, и ошибки не выдается! Я могу ошибаться или путать цель синглтона. Я много об этом искал тут и там, но, похоже, ничего не ответило на мой вопрос.

Спасибо заранее

3 ответа

Решение

Вы не возвращаете объект в своем коде, но ваш синтаксис предполагает, что вы есть.

$obj = Foo::instance();

Вернул бы один экземпляр

$obj2 = Foo::instance();

Тогда бы показать, что $obj а также $obj2 один и тот же экземпляр

Таким образом, чтобы дать ему некоторый контекст, удалите слово static от google функция. Затем вы можете сделать:

$obj = Foo::instance();
// $obj is now an object and can call its methods
`$obj->google();

Это не демонстрирует функциональность синглетонов, а скорее функциональность объектно-ориентированного программирования. Но я не уверен, что вы знаете, что вам действительно нужно использовать Singleton

Немного обновил ваш код, чтобы объяснить вам, как работает шаблон синглтона. Практической реализацией этого будет ваш класс базы данных, где вы не хотите иметь несколько экземпляров соединения с базой данных в одном потоке выполнения.

class Foo {
    static $inst = null;
    static function instance() {

        if ($inst === null) {
            $inst = new self;
        }
        return $inst;
    }

    static function google(){
        echo 'google';
    }
    private function __construct() { }
    private function __clone() { }
    private function __wakeup() { }
}

Теперь создайте экземпляр класса и сравните их объекты, используя var_dump.

$obj = Foo::instance();
$obj1 = Foo::instance();

var_dump($obj === $obj1);             // bool(true)

В этом примере вы не используете singleton, чтобы получить экземпляр singleton, вы должны вызвать foo::instance() он всегда вернет вам один и тот же объект.

Другие вопросы по тегам