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