Что означает new self (); в PHP?
Я никогда не видел такой код:
public static function getInstance()
{
if ( ! isset(self::$_instance)) {
self::$_instance = new self();
}
return self::$_instance;
}
это то же самое как new className() ?
EDIT
если класс является наследником, на какой класс он указывает?
5 ответов:
selfуказывает на класс в котором это написано.Итак, если ваш метод getInstance находится в имени класса
MyClassследующую строку :self::$_instance = new self();будет делать то же, что :
self::$_instance = new MyClass();
Edit: еще пара информации, после комментариев.
если у вас есть два класса, которые расширяют друг друга, у вас есть две ситуации :
getInstanceis определен в дочернем классе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вот почему 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, вы можете взглянуть на Поздние Статические Привязки страница руководства по PHP.
это, кажется, реализация Синглтон шаблон. Функция вызывается статически и проверяет, имеет ли статический класс переменную
$_instanceset.если это не так, он инициализирует экземпляр себе (
new self()) и сохраняет его в$_instance.если вы называете
className::getInstance()вы получаете один и тот же экземпляр класса при каждом вызове, который является точкой одноэлементного шаблона.Я никогда не видел его таким сделал это таким образом, хотя, честно говоря, не знал, что это возможно. Что такое
$_instanceобъявлен в классе?
это, скорее всего, используется в одноэлементном шаблоне проектирования, где конструктор определяется как частный, чтобы избежать создания экземпляра, двойной двоеточие
(::)оператор может получить доступ к членам, которые объявлены статическими внутри класса, поэтому, если есть статические члены, псевдо-переменная $this не может быть использована, следовательно, вместо кода используется self, Синглеты-это хорошие методы программирования, которые позволят только 1 экземпляр объекта, такого как обработчики соединителя базы данных. Из клиентского кода, доступ к этому экземпляру будет осуществляться путем создания одной точки доступа, в этом случае он назвал ееgetInstance(), getInstance сам по себе был функцией, которая создала объект, в основном используя ключевое слово new для создания объекта, означающего, что метод конструктора также был вызван.строку
if(!isset(self::instance))проверяет, если объект уже был создан, вы не могли понять это, потому что код-это просто фрагмент, где-то в верхней части, должны быть статические члены, такие как наверноеprivate static $_instance = NULL;в обычных классах мы бы получили доступ к этому члену просто
$this->_instance = 'something';но его объявленный статический и поэтому мы не могли использовать $ этот код, который мы используем вместо
self::$_instanceпроверяя, есть ли объект, хранящийся в этой статической переменной класса, класс может затем решить создать или не создавать один экземпляр, поэтому, если его не установить,!isset, то есть объект не существует в статическом члене $_instance, затем он генерирует новый объект, сохранил его в статическом члене
$_instanceкомандойself::$_instance = new self();и вернул его в код клиента. Затем клиентский код может с радостью использовать один экземпляр объекта с его открытыми методами, но в клиентском коде, вызывая единую точку доступа, то есть
getInstance()метод также сложно, он должен называться так$thisObject = className::getInstance();причина, функция сама по себе объявлена статической.
Да, это как
new className()(ссылаясь на класс, содержащий этот метод), вероятно, используется в одноэлементном шаблоне, где конструктор является частным.
Если класс наследуется, то вызов getInstance () от child не даст вам экземпляр child. Он возвращает только экземпляр родительского экземпляра. Это потому, что мы называем новое я().
Если вы хотите, чтобы дочерний класс возвращал экземпляр дочернего класса, используйте new static() в getInstance (), и он затем вернет экземпляр дочернего класса. Это называется поздняя привязка!!