Я никогда не видел такой код:
public static function getInstance() { if ( ! isset(self::$_instance)) { self::$_instance = new self(); } return self::$_instance; }
Это то же самое, что и new className()
?
РЕДАКТИРОВАТЬ
Если класс наследуется, на каком классе он указывает?
self
указывает на класс, в котором он написан.
Итак, если ваш метод getInstance находится в имени класса MyClass
, следующая строка:
self::$_instance = new self();
Будет делать то же самое, что:
self::$_instance = new MyClass();
Изменить: пара дополнительных сведений, после комментариев.
Если у вас есть два класса, которые расширяют друг друга, у вас есть две ситуации:
getInstance
определяется в дочернем классе getInstance
определяется в родительском классе Первая ситуация будет выглядеть так (я удалил весь ненужный код, для этого примера – вам нужно будет добавить его обратно, чтобы получить поведение singleton) *:
class MyParentClass { } class MyChildClass extends MyParentClass { public static function getInstance() { return new self(); } } $a = MyChildClass::getInstance(); var_dump($a);
Здесь вы получите:
object(MyChildClass)#1 (0) { }
Это означает, что « self
означает « MyChildClass
то есть класс, в котором он написан.
Для второй ситуации код будет выглядеть так:
class MyParentClass { public static function getInstance() { return new self(); } } class MyChildClass extends MyParentClass { } $a = MyChildClass::getInstance(); var_dump($a);
И вы получите такой вывод:
object(MyParentClass)#1 (0) { }
Это означает, что self
означает MyParentClass
– то есть здесь тоже класс, в котором он написан .
С PHP <5.3, что «класс, в котором он написан» важен, и может иногда вызывать проблемы.
Вот почему PHP 5.3 представляет новое использование для static
ключевого слова: теперь он может использоваться точно там, где мы использовали self
в этих примерах:
class MyParentClass { public static function getInstance() { return new static(); } } class MyChildClass extends MyParentClass { } $a = MyChildClass::getInstance(); var_dump($a);
Но, со static
вместо self
, вы теперь получите:
object(MyChildClass)#1 (0) { }
Это означает, что static
тип точек для используемого класса (мы использовали MyChildClass::getInstance()
), а не тот, в котором он написан.
Конечно, поведение « self
» не было изменено, чтобы не нарушать существующие приложения. PHP 5.3 просто добавил новое поведение, переработав static
ключевое слово.
И, говоря о PHP 5.3, вы можете взглянуть на страницу Late Static Bindings руководства PHP.
Кажется, это реализация шаблона Singleton . Функция называется статически и проверяет, имеет ли статический класс переменную $_instance
.
Если это не так, он инициализирует экземпляр себя ( new self()
) и сохраняет его в $_instance
.
Если вы вызываете className::getInstance()
вы получите один и тот же экземпляр класса при каждом вызове, который является точкой шаблона singleton.
Я никогда не видел, чтобы это делалось так, и, честно говоря, не знал, что это возможно. Что такое $_instance
объявленное как в классе?
Это, скорее всего, используется в шаблоне проектирования singleton, где конструктор определяется как закрытый, чтобы избежать создания экземпляра, оператор double (::)
может обращаться к элементам, объявленным статическими внутри класса, поэтому, если есть статические члены, псевдо переменная $ this не может быть использована, поэтому вместо этого используется код self, Singletons – хорошие методы программирования, которые позволят только один экземпляр объекта, такого как обработчики соединителя базы данных. Из клиентского кода доступ к этому экземпляру можно было бы сделать, создав единую точку доступа, в этом случае он назвал это getInstance()
, сам getInstance был функцией, которая создала объект в основном с использованием нового ключевого слова для создания объекта, означающего был также вызван метод конструктора.
строка if(!isset(self::instance))
проверяет, был ли объект уже создан, вы не могли понять этого, потому что код является всего лишь фрагментом, где-то сверху, должны быть статические члены, например, вероятно
private static $_instance = NULL;
в обычных классах мы могли бы получить доступ к этому члену просто
$this->_instance = 'something';
но его объявленный статический и поэтому мы не могли использовать $ этот код, который мы используем вместо этого
self::$_instance
проверяя, есть ли объект, хранящийся в этой переменной статического класса, класс может затем решить создать или не создать один экземпляр, поэтому, если его не установить,! isset, что означает, что объект не существует на статическом члене $ _instance, тогда он генерирует новый объект, $_instance
его в статическом члене $_instance
командой
self::$_instance = new self();
и вернул его клиенту. Затем клиентский код может с радостью использовать единственный экземпляр объекта с его общедоступными методами, но в клиентском коде, вызывающем единую точку доступа, то есть метод getInstance()
также является сложным, его нужно вызвать как это
$thisObject = className::getInstance();
причина, сама функция объявляется статической.
Да, это похоже на new className()
(ссылающийся на класс, содержащий этот метод), вероятно, используемый в шаблоне Singleton, где конструктор является закрытым.
Если класс унаследован, то вызов getInstance () из дочернего объекта не даст вам экземпляр дочернего элемента. Он вернет экземпляр родительского экземпляра. Это потому, что мы называем new self ().
Если вы хотите, чтобы дочерний класс вернул экземпляр дочернего класса, используйте новый static () в getInstance (), после чего он вернет экземпляр дочернего класса. Это называется поздним связыванием !!