Что нового: self(); означает в PHP?
Я никогда не видел такой код:
public static function getInstance()
{
if ( ! isset(self::$_instance)) {
self::$_instance = new self();
}
return self::$_instance;
}
Это то же самое, что и new className()
?
ИЗМЕНИТЬ
Если класс наследуется, какой класс указывает на?
Ответы
Ответ 1
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, вы можете взглянуть на страницу
Ответ 2
Кажется, это реализация Singleton pattern.
Эта функция называется статически и проверяет, имеет ли статический класс переменную $_instance
.
Если это не так, он инициализирует экземпляр самого себя (new self()
) и сохраняет его в $_instance
.
Если вы вызываете className::getInstance()
, вы получите один и тот же экземпляр класса для каждого вызова, который является точкой одноэлементного шаблона.
Я никогда не видел, чтобы это делалось так, и, честно говоря, не знал, что это возможно.
Что объявляется $_instance
как в классе?
Ответ 3
Это наиболее вероятно используется в шаблоне проектирования singleton, где конструктор определяется как закрытый, чтобы избежать создания экземпляра, оператор double colon (::)
может обращаться к членам, объявленным статическими внутри класса, поэтому, если есть статические члены, псевдо переменная $, это не может быть использовано, поэтому вместо этого используется код self, Singletons - хорошие методы программирования, которые позволят только один экземпляр объекта, такого как обработчики соединителя базы данных. Из клиентского кода доступ к этому экземпляру будет выполняться путем создания единственной точки доступа, в этом случае он назвал ее getInstance()
, сам getInstance был функцией, которая создала объект в основном с использованием нового ключевого слова для создания объекта, означающего был также вызван метод конструктора.
строка if(!isset(self::instance))
проверяет, был ли объект уже создан, вы не могли понять этого, потому что код является всего лишь фрагментом, где-то сверху, должны быть статические члены, например, вероятно,
private static $_instance = NULL;
в обычных классах мы могли бы получить доступ к этому члену просто
$this->_instance = 'something';
но его объявленный статический и, таким образом, мы не сможем использовать $этот код, который мы используем вместо
self::$_instance
проверяя, есть ли объект, хранящийся в этой переменной статического класса, класс может затем решить создать или не создать один экземпляр, поэтому, если его не установить,! isset, то есть объект не существует для статического члена $_instance, то он генерирует новый объект, сохраняя его в статическом элементе $_instance
командой
self::$_instance = new self();
и вернул его клиенту. Затем клиентский код может с радостью использовать единственный экземпляр объекта с его общедоступными методами, но в клиентском коде, вызывающем единую точку доступа, то есть метод getInstance()
также является сложным, его нужно вызвать так:/p >
$thisObject = className::getInstance();
причина, сама функция объявляется static.
Ответ 4
Да, это как new className()
(ссылаясь на класс, содержащий этот метод), вероятно, используется в шаблоне Singleton, где конструктор является закрытым.
Ответ 5
Если класс наследуется, то вызов getInstance() из child не даст вам экземпляр дочернего элемента. Он вернет экземпляр родительского экземпляра.
Это связано с тем, что мы называем new self().
Если вы хотите, чтобы дочерний класс возвращал экземпляр дочернего класса, используйте новый static() в getInstance(), после чего он вернет экземпляр дочернего класса. Это называется поздним связыванием!!