Что означает new self (); в PHP?


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

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

это то же самое как new className() ?

EDIT

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

5 88

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