PHP не позволяет объекту создавать экземпляры более одного раза - PullRequest
0 голосов
/ 25 января 2012

У меня есть абстрактный класс, который наследуется рядом других классов. Я бы хотел, чтобы вместо того, чтобы каждый раз повторять создание экземпляра (__construct ()) одного и того же класса, чтобы он инициализировался только один раз и использовались свойства ранее унаследованных классов.

Я использую это в моей конструкции:

function __construct() {
         self::$_instance =& $this;

         if (!empty(self::$_instance)) {
            foreach (self::$_instance as $key => $class) {
                     $this->$key = $class;
            }
         }
}

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

Какие-нибудь предложения для лучшего способа сделать это?

Ответы [ 2 ]

9 голосов
/ 25 января 2012

То есть конструкция Singleton:

class MyClass {
    private static $instance = null;
    private final function __construct() {
        //
    }
    private final function __clone() { }
    public final function __sleep() {
        throw new Exception('Serializing of Singletons is not allowed');
    }
    public static function getInstance() {
        if (self::$instance === null) self::$instance = new self();
        return self::$instance;
    }
}

Я создал конструктор и __clone() private final, чтобы препятствовать людям клонировать и напрямую создавать его экземпляры.Вы можете получить экземпляр Singleton через MyClass::getInstance()

Если вы хотите, чтобы абстрактный базовый синглтон-класс взглянул на это: https://github.com/WoltLab/WCF/blob/master/wcfsetup/install/files/lib/system/SingletonFactory.class.php

1 голос
/ 25 января 2012

Вы ссылаетесь на шаблон Singleton:

class Foo {
    private static $instance;

    private function __construct() {
    }

    public static function getInstance() {
        if (!isset(static::$instance)) {
            static::$instance = new static();
        }

        return static::$instance;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...