- Что означает new self(); в PHP?
- 5 ответов
- Типы данных в PHP: self и parent
- Использование в качестве аргумента функции
- Использование в качестве типа возвращаемого значения
- Сеттеры
- Фабричные методы
- parent
- ЗлостныйКодер
- четверг, 19 декабря 2013 г.
- Разница между $this и self в PHP. Подробная версия.
- Что делает new self (); имеете в виду в PHP?
Что означает new self(); в PHP?
Я никогда не видел такого кода:
Это то же самое, что new className() ?
EDIT
Если класс наследуется, на какой класс он указывает?
5 ответов
Возможный Дубликат : Понимание Приращения Ссылка-Что означает этот символ в PHP? Что означает ++ , я видел это также в javascript $this->instance = ++self::$instances; с уважением
self указывает на класс, в котором он написан.
Итак, если ваш метод getInstance находится в имени класса MyClass , следующая строка :
Будет делать то же самое, что и :
Правка : еще пара сведений, после комментариев.
Если у вас есть два класса, которые расширяют друг друга, у вас есть две ситуации :
- getInstance определяется в дочернем классе
- getInstance определяется в родительском классе
Первая ситуация будет выглядеть следующим образом (я удалил весь ненужный код для этого примера-вам придется добавить его обратно, чтобы получить поведение singleton)* :
Здесь вы получите :
Что означает self означает MyChildClass -то есть класс, в котором он написан.
Для второй ситуации код будет выглядеть следующим образом :
И вы получите такой результат :
Это означает, что self означает MyParentClass , то есть здесь тоже класс, в котором он написан .
С PHP static : теперь его можно использовать именно там, где мы использовали self в этих примерах :
Но с static вместо self вы теперь получите :
Это означает, что static указывает на используемый класс (мы использовали MyChildClass::getInstance() ), а не на тот, в котором он написан.
Конечно, поведение self не было изменено, чтобы не нарушать существующие приложения-PHP 5.3 просто добавил новое поведение, переработав ключевое слово static .
И, говоря о PHP 5.3, вы, возможно, захотите взглянуть на страницу Поздних статических привязок руководства PHP.
Я много раз сталкивался с этой строкой в модулях perl, но не мог понять, что именно это означает. my ($self, %myInputs) = @_; Пожалуйста, объясните мне это заявление,чтобы я мог продолжить.
Это используется в паттерне weakify Objective-C Я предполагаю, что это означает: назначьте слабую ссылку на self с именем ‘weakSelf’ и типом self (например, MyViewController) Если это правильно и кажется вам очевидным: я хочу быть абсолютно уверен, что все будет правильно. Спасибо.
По-видимому, это реализация шаблона Singleton . Функция вызывается статически и проверяет, имеет ли статический класс переменную $_instance .
Если это не так, он инициализирует экземпляр самого себя ( new self() ) и сохраняет его в $_instance .
Если вы вызовете className::getInstance() , вы получите один и тот же экземпляр класса при каждом вызове, что является точкой шаблона singleton.
Однако я никогда не видел, чтобы это делалось таким образом, и, честно говоря, не знал, что это возможно. Что такое $_instance , объявленное как в классе?
Это, скорее всего, используется в шаблоне проектирования singleton, где конструктор определен как частный, чтобы избежать создания экземпляра, оператор double colon (::) может получить доступ к элементам, объявленным статическими внутри класса, поэтому, если есть статические элементы, псевдо-переменная $this не может быть использована, поэтому код, используемый вместо этого, Синглеты-это хорошие методы программирования, которые позволят использовать только 1 экземпляр объекта, например обработчики соединителя базы данных. Из клиентского кода доступ к этому экземпляру будет осуществляться путем создания одной точки доступа, в этом случае он назвал ее getInstance() , getInstance сама по себе была функцией , которая создала объект, в основном используя ключевое слово new для создания объекта, что означает, что также был вызван метод конструктора.
строка if(!isset(self::instance)) проверяет, был ли объект уже создан, вы не могли этого понять, потому что код-это просто фрагмент, где-то в верхней части должны быть статические элементы, такие как, вероятно,
в обычных классах мы бы получили доступ к этому члену просто
но он объявлен статическим, и поэтому мы не могли использовать код $this, который мы используем вместо этого
проверив, есть ли объект, сохраненный в этой переменной статического класса, класс может затем решить, создавать или не создавать один экземпляр, поэтому, если он не установлен,! isset, что означает, что объект не существует в статическом члене $_instance,, он генерирует новый объект, сохраняет его в статическом члене $_instance с помощью команды
и вернул его в клиентский код. Затем клиентский код может с радостью использовать единственный экземпляр объекта с его общедоступными методами, но в клиентском коде вызов единой точки доступа, то есть метода getInstance() , также сложен, его нужно вызывать следующим образом
причина в том, что функция сама по себе объявлена статической.
Источник
Типы данных в PHP: self и parent
Начиная с PHP 5.0 , мы можем указывать типы данных аргументов функции, а с выходом новых версий PHP количество возможных type hints увеличилось. Краткий ликбез в PHP self :
В PHP 5.0 мы можем указывать типы параметров при определении функции , а начиная с PHP 7.0 , можем использовать для этого скалярные типы данных. Также, начиная с PHP 7.0 , можно указывать типы возвращаемых функцией значений . Давайте подробнее рассмотрим типы self и parent . Они всегда были доступны, но мы редко видим их использование. Почему так?
PHP self означает объект того же типа ( текущего класса или подкласса ). Для каждой переменной должно выполняться условие instanceof по отношению к текущему классу.
Использование в качестве аргумента функции
Бывает необходимо спроектировать связь между объектами одного типа. В данном случае тип self может быть полезен.
Когда мы создаем реализацию этого интерфейса ( или рефакторим код без соблюдения SOLID принципов ) следует заменить тип self оригинальным названием класса или интерфейса:
Использование в качестве типа возвращаемого значения
Давайте разберемся, в каких ситуациях можно использовать new self PHP в качестве типа возвращаемого значения.
Сеттеры
Один из самых очевидных примеров использования — это сеттеры ( или мутаторы ) с возможностью сцепления ( chaining ):
Когда вы используете self , тип возвращаемого значения не важен, если метод возвращает клонированный объект ( это тот случай, когда вы имеете дело с неизменяемыми объектами ). Возвращаемый объект того же типа, что и объект, метод которого был вызван:
При расширении или реализации метода в дочернем классе необходимо явно указать тип, чтобы объявление было совместимым:
Если вы будете использовать этот объект, то он сообщит IDE , что все, что возвращается, будет иметь тип Foo ( интерфейс ). В итоге он не будет автоматически заполнять этим методом имена в реализации класса Foo :
В приведенном выше примере, если setBaz не является методом интерфейса Foo , он не будет признан IDE . Таким образом, для построения цепочки методов тип возвращаемого значения self PHP class не особенно полезен.
До PHP 7.0 мы обычно объявляли только типы возвращаемых значений в DocBlock comments с @return $this , @return self или @return static . Для цепочечных методов, которые я до сих пор использую, @return static и @return $this в docblocks .
Фабричные методы
Нелегко найти пример метода, который не является сеттером и возвращает объект того же класса. Но вот он:
Реализация будет выглядеть так:
Я не говорю, что это хороший пример. Этот метод не указан явно в интерфейсе. Есть, конечно, фабричные методы и лучше. Например, методы, которые могут возвращать тип PHP self . Просто на данный момент я не могу придумать практичный пример.
parent
Документация PHP говорит, что parent допустимый тип данных. Давайте разберемся, что он из себя представляет:
parent всегда указывает на класс, который вы расширяете. Для примера выше: Bar или один из его дочерних классов. То есть передаваемый объект может быть другим дочерним от Bar .
В данном случае parent не может указывать на интерфейс. И схема работы примерна такая же, когда вы вызываете метод родительского класса ( parent::setBar например ). Другими словами, parent можно использовать только тогда, когда текущий класс расширяет какой-то другой класс.
Есть несколько причин, почему тип parent не используется:
- Когда при разработке кода соблюдаются SOLID принципы, то почти все — это либо интерфейс, либо класс реализации ( конечный узел в дереве наследования ). Количество абстрактных классов очень мало, а расширенных классов почти нет. Таким образом, использование типа parent бесполезно за исключением некоторых очень редких случаев;
- Использование интерфейсов или реализующих классов ( PHP self ) для type hints предпочтительней, чему соответствуют различные принципы и методики программирования — SOLID , принцип подстановки Барбары Лисков ( объекты должны быть заменяемы объектами подтипов ), принцип разделения интерфейсов и принцип инверсии зависимостей ( зависимость от абстракций, в данном случае интерфейсов ).
Дайте знать, что вы думаете по этой теме статьи в комментариях. За комментарии, подписки, лайки, отклики, дизлайки низкий вам поклон!
Пожалуйста, опубликуйте свои отзывы по текущей теме статьи. За комментарии, лайки, отклики, дизлайки, подписки низкий вам поклон!
Источник
ЗлостныйКодер
Программирование, Алгоритмы, С++, C#, Java, Python и другие вещи
четверг, 19 декабря 2013 г.
Разница между $this и self в PHP. Подробная версия.
У каждого обычно возникает вопрос, что такое $this, что такое self, для чего они используются и в чем разница между ними?
ПРАВИЛА КОТОРЫЕ ВЫ ДОЛЖНЫ ЗАПОМНИТЬ:
- Статические функции должны использовать только статические переменные.
- self ТОЛЬКО для статических функций, свойств. Но также можно вызвать нестатический метод, КАК СТАТИЧЕСКИЙ через self. Но лучше так не делать, а то папа побьет.
- this ТОЛЬКО для нестатических.
- this требует, чтобы класс был проинстанцирован, self не требует.
$this — это ССЫЛКА на ТЕКУЩИЙ объект и она нужна, чтобы обратиться к переменной в КОНТЕКСТЕ класса. К примеру:
Обычна нужна, чтобы инициализировать поля в конструкторе, ну и не только:
$self используется в том, же самом ключе, но уже для СТАТИЧЕСКИХ свойств:
Проверочная программа которая показывает главную разницу между self и $this:
class Klass <
const STAT = ‘S’ ; // константы всегда статичны static $stat = ‘Static’ ;
public $publ = ‘Public’ ;
private $priv = ‘Private’ ;
protected $prot = ‘Protected’ ;
public function show ( ) <
print ‘
self::STAT: ‘ . self :: STAT ; // ссылается на константу
print ‘
self::$stat: ‘ . self :: $stat ; // статическая переменная.
print ‘
$this->stat: ‘ . $this -> stat ; // Ошибки нет, но выведет пустую строку. ПРЕДУПРЕЖДЕНИЕ.
print ‘
$this->publ: ‘ . $this -> publ ; // выведет как надо
print ‘
‘ ;
>
> $me = new Klass () ; $me -> show () ;
Результат:
self::STAT: S
self::$stat: Static
Strict Standards: Accessing static property Klass::$stat as non static in htdocs\test\testReference.php on line ..
Notice: Undefined property: Klass::$stat in C:\xampp\htdocs\test\testReference.php on line 50
$this->stat:
$this->publ: Public
Видно, что php умный и кидает предупреждения глупым программистам. Не делайте так.
Второе главное отличие состоит в том, что
self не использует таблицу виртуальных методов, то есть:
(взято с StackOverflow)
Hello, I’m Ludwig the geek
Goodbye from Ludwig the person
Пояснение:
Метод sayHello использует this, поэтому виртуальная таблица вызовет Geek::getTitle()
Метод sayGoodbye использует self, поэтому виртуальная таблица будет не задействована и будет вызван parent::getTitle()
Решение:
Используем вместо self, static keyword:
public function sayGoodbye() <
echo «Goodbye from «. static::getTitle() ;
Источник
Что делает new self (); имеете в виду в PHP?
Я никогда не видел такого кода:
Это то же самое, что и new className() ?
РЕДАКТИРОВАТЬ
Если класс является наследственным, на какой класс он указывает?
self указывает на класс, в котором он написан.
Итак, если ваш метод getInstance находится в имени класса MyClass , следующая строка:
Будет делать то же самое, что:
Изменить: еще пара информации после комментариев.
Если у вас есть два класса, которые расширяют друг друга, у вас есть две ситуации:
- getInstance определен в дочернем классе
- getInstance определен в родительском классе
Первая ситуация будет выглядеть так (я удалил весь ненужный код, для этого примера — вам придется добавить его обратно, чтобы получить одноэлементное поведение) *:
Здесь вы получите:
Это означает , self средства MyChildClass — то есть класс , в котором она написана.
Для второй ситуации код будет выглядеть так:
И вы получите такой вывод:
Какие средства self средства MyParentClass — то есть здесь, класс , в котором она написана .
В PHP static ключевого слова: теперь его можно использовать именно там, где мы использовали self в этих примерах:
Но static вместо этого self теперь вы получите:
Это означает, что этот static вид указывает на используемый класс (который мы использовали MyChildClass::getInstance() ), а не на тот, в котором он написан.
Конечно, поведение self не было изменено, чтобы не нарушать работу существующих приложений — PHP 5.3 просто добавил новое поведение, повторяя static ключевое слово.
И, говоря о PHP 5.3, вы можете взглянуть на страницу Late Static Bindings в руководстве по PHP.
Похоже, это реализация паттерна Синглтон . Функция вызывается статически и проверяет, установлен ли в статическом классе переменная $_instance .
Если это не так, он инициализирует свой экземпляр ( new self() ) и сохраняет его в $_instance .
Если вы вызовете, className::getInstance() вы получите один и тот же экземпляр класса при каждом вызове, что является точкой шаблона singleton.
Однако я никогда не видел, чтобы это делалось таким образом, и, честно говоря, не знал, что это возможно. Что $_instance заявлено как в классе?
Это, скорее всего, используется в шаблоне проектирования singleton, в котором конструктор определен как частный, чтобы избежать создания экземпляра, (::) оператор двойного двоеточия может обращаться к членам, которые объявлены статическими внутри класса, поэтому, если есть статические члены, псевдопеременная $ это не может быть использовано, следовательно, вместо этого используется код self. Синглтоны — это хорошие методы программирования, которые допускают только 1 экземпляр объекта, например обработчики соединителей базы данных. Из клиентского кода доступ к этому экземпляру будет осуществляться путем создания единой точки доступа, в этом случае он назвал ее getInstance() , getInstance сама по себе была функцией, которая создала объект, в основном используя ключевое слово new для создания объекта, что означает, что метод конструктора был также называется.
строка if(!isset(self::instance)) проверяет, был ли уже создан объект, вы не могли этого понять, потому что код — это всего лишь фрагмент, где-то вверху должны быть статические члены, например, вероятно
в обычных классах мы получили бы доступ к этому члену просто
но он объявлен статическим, и поэтому мы не могли использовать код $ this, который мы используем вместо
проверив, есть ли объект, хранящийся в этой статической переменной класса, класс может решить создавать или не создавать единственный экземпляр, поэтому, если он не установлен,! isset, что означает, что в статическом члене $ _instance нет объекта, тогда он генерирует новый объект, сохраняет его в статическом члене $_instance командой
и вернул его в клиентский код. Затем клиентский код может с радостью использовать единственный экземпляр объекта с его общедоступными методами, но в клиентском коде, вызывая единственную точку доступа, то есть getInstance() метод также сложен, его нужно вызывать следующим образом
причина, функция сама по себе объявлена статической.
Источник