Что делает новый сам (); средний в PHP?

Я никогда не видел код как это:

public static function getInstance()
{
    if ( ! isset(self::$_instance)) {
        self::$_instance = new self();
    }
    return self::$_instance;
}

Действительно ли это - то же как new className() ?

Править

Если класс является inheritant, на какой класс он указывает?

104
задан user198729 7 March 2010 в 14:03
поделиться

3 ответа

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.

202
ответ дан 24 November 2019 в 04:08
поделиться

Похоже, что это реализация паттерна Singleton. Функция вызывается статически и проверяет, установлена ли у статического класса переменная $_instance.

Если нет, она инициализирует экземпляр самого себя (new self()) и сохраняет его в $_instance.

Если вы вызовете className::getInstance(), вы получите один и тот же экземпляр класса при каждом вызове, в чем и заключается смысл паттерна singleton.

Однако я никогда не видел, чтобы это делалось таким образом, и, честно говоря, не знал, что это возможно. Как объявлен $_instance в классе?

9
ответ дан 24 November 2019 в 04:08
поделиться

Да, это похоже на new className () (относится к классу, содержащему этот метод), вероятно, используется в шаблоне Singleton, где конструктор частный.

2
ответ дан 24 November 2019 в 04:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: