Я никогда не видел код как это:
public static function getInstance()
{
if ( ! isset(self::$_instance)) {
self::$_instance = new self();
}
return self::$_instance;
}
Действительно ли это - то же как new className()
?
Править
Если класс является inheritant, на какой класс он указывает?
self
указывает на класс, в котором он написан.
Итак, если ваш метод getInstance находится в имени класса MyClass
, следующая строка:
self::$_instance = new self();
будет делать то же самое, что и:
self::$_instance = new MyClass();
Edit: еще пара информации после комментариев.
Если у вас есть два класса, которые расширяют друг друга, у вас есть две ситуации:
getInstance
определен в дочернем классе getInstance
определен в родительском классе Первая ситуация будет выглядеть так (я удалил весь ненужный код, в этом примере - вам придется добавить его обратно, чтобы получить одноэлементное поведение) *:
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
of 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
в классе?
Да, это похоже на new className ()
(относится к классу, содержащему этот метод), вероятно, используется в шаблоне Singleton, где конструктор частный.