Что означает 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: еще пара информации, после комментариев.
если у вас есть два класса, которые расширяют друг друга, у вас есть две ситуации :
getInstance
is определен в дочернем классе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.
это, кажется, реализация Синглтон шаблон. Функция вызывается статически и проверяет, имеет ли статический класс переменную
$_instance
set.если это не так, он инициализирует экземпляр себе (
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 (), и он затем вернет экземпляр дочернего класса. Это называется поздняя привязка!!