Что нового: 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(), после чего он вернет экземпляр дочернего класса. Это называется поздним связыванием!!