Меню Закрыть

This php что это

Содержание

$this в php — объясните, пожалуйста, по-простому — что это и какой функционал несет в себе

1 ответ 1

$this используется при ООП. Это псевдо-переменная, которая является ссылкой на вызываемый объект, доступна если свойство или метод был вызван в контексте объекта. Обычно это тот объект, которому принадлежит вызванный метод, но может быть и другой объект, если метод был вызван статически из контекста другого объекта (хотя в PHP7 вызов нестатического метода статическим способом из неподходящего контекста приведет к тому, что $this будет неопределен внутри метода).

Пример использования $this в классе:

Как видим, писать $this можно только внутри области, ограниченной class <>

Более подробные примеры можно посмотреть в документации http://php.net/manual/ru/language.oop5.basic.php

Всё ещё ищете ответ? Посмотрите другие вопросы с метками php или задайте свой вопрос.

Похожие

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

дизайн сайта / логотип © 2020 Stack Exchange Inc; пользовательское содержимое попадает под действие лицензии cc by-sa 4.0 с указанием ссылки на источник. rev 2020.1.17.35809

Начиная с 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 , принцип подстановки Барбары Лисков ( объекты должны быть заменяемы объектами подтипов ), принцип разделения интерфейсов и принцип инверсии зависимостей ( зависимость от абстракций, в данном случае интерфейсов ).

Данная публикация представляет собой перевод статьи « PHP type hints: self and parent » , подготовленной дружной командой проекта Интернет-технологии.ру

Программирование, Алгоритмы, С++, C#, Java, Python и другие вещи

четверг, 19 декабря 2013 г.

Разница между $this и self в PHP. Подробная версия.

У каждого обычно возникает вопрос, что такое $this, что такое self, для чего они используются и в чем разница между ними?
ПРАВИЛА КОТОРЫЕ ВЫ ДОЛЖНЫ ЗАПОМНИТЬ:

  1. Статические функции должны использовать только статические переменные.
  2. self ТОЛЬКО для статических функций, свойств. Но также можно вызвать нестатический метод, КАК СТАТИЧЕСКИЙ через self. Но лучше так не делать, а то папа побьет.
  3. this ТОЛЬКО для нестатических.
  4. this требует, чтобы класс был проинстанцирован, self не требует.
Читайте также:  Outlast 2 дата выхода

$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 est estReference.php on line ..
Notice: Undefined property: Klass::$stat in C:xampphtdocs est estReference.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() ;

Рекомендуем к прочтению

Добавить комментарий

Ваш адрес email не будет опубликован.