Для перепечатки, пожалуйста, укажите источник статьи: https://tlanyan.me/self-in – php/
Кто-то из группы PHP спросил self
Ответ на использование ключевых слов очевиден: их нельзя использовать в статических функциях-членах это
Вызов функций, не являющихся членами, но вы можете использовать self
Вызов статических функций-членов/переменных/констант; другие функции-члены могут использоваться self
Вызов статических функций-членов и нестатических функций-членов. По ходу обсуждения было установлено, что я
Все не так просто. В связи с этим в данной статье сначала сравниваются и дифференцируются несколько ключевых слов, а затем они суммируются. самостоятельное
Использование.
и родительские, статические, а также эти различия
Чтобы досконально понять себя
Быть с родителем
, статичным
, а также это
Различать. Делаются следующие сравнения.
родитель
я
и родитель
Легче различать: родительский
, Ссылающийся на методы (или переменные), родительские/базовые классы которых скрыты, сам
Ссылающийся на ваш собственный метод (или переменную). Например, родительский конструктор вызывается в конструкторе:
class Base { public function __construct() { echo "Base contructor!", PHP_EOL; } } class Child { public function __construct() { parent::__construct(); echo "Child contructor!", PHP_EOL; } } new Child; // Output: // Base contructor! // Child contructor!
статический
статическое
Обычное использование заключается в изменении функций или переменных, чтобы они стали функциями класса и переменными класса, или в изменении переменных внутри функций, чтобы продлить их срок службы до срока службы всего приложения. Но с self
Ассоциацией-это новое использование, введенное начиная с PHP 5.3: статическая отложенная привязка.
забеременеть статика
Статическая функция отложенной привязки может динамически определять класс атрибуции во время выполнения. Например:
class Base { public function __construct() { echo "Base constructor!", PHP_EOL; } public static function getSelf() { return new self(); } public static function getInstance() { return new static(); } public function selfFoo() { return self::foo(); } public function staticFoo() { return static::foo(); } public function thisFoo() { return $this->foo(); } public function foo() { echo "Base Foo!", PHP_EOL; } } class Child extends Base { public function __construct() { echo "Child constructor!", PHP_EOL; } public function foo() { echo "Child Foo!", PHP_EOL; } } $base = Child::getSelf(); $child = Child::getInstance(); $child->selfFoo(); $child->staticFoo(); $child->thisFoo();
Вывод программы выглядит следующим образом:
Base constructor! Child constructor! Base Foo! Child Foo! Child Foo!
В ссылках на функции self
и статический
Разница заключается в следующем: для статических функций-членов self
Указывает на текущий класс кода, статический
Указывает на вызывающий класс; для нестатических функций-членов self
Подавляет полиморфизм, указывая на функцию-член текущего класса, статический
Эквивалентно это
Динамически указывает на функцию, вызывающую класс.
родитель
、 сам
、 статический
Интересно видеть три ключевых слова вместе, указывающие на родительский класс, текущий класс и подкласс соответственно, которые имеют привкус “прошлого, настоящего и будущего”.
этот
я
и это
Это сочетание наиболее обсуждается и наиболее легко используется не по назначению. Основные различия между ними заключаются в следующем:
этот
Нельзя использовать в статических функциях-членах.сам
Уверен;- Доступ к статическим функциям-членам/переменным, предложение использовать
самостоятельно
Не использовать$это::
или |/$это->Форма;
Доступ к нестатическим переменным-членам, недоступным - самостоятельно
Его можно использовать только
это;
это Для использования, когда объект был создан,
selfТакого ограничения нет;
Используется в нестатических функциях-членах,- самостоятельно
Подавляя полиморфизм, ссылаясь на функции текущего класса; и
этоСсылка на функцию переопределения вызывающего класса, если таковая имеется.
самостоятельное Использование
Прочитав различия между тремя ключевыми словами, упомянутыми выше, self
Предназначен ли он для немедленного использования? Подводя итог, можно сказать, что: я
Всегда указывайте на “текущий класс (и экземпляр класса)”. В деталях это:
- Замените имя класса ссылкой на статические переменные-члены и статические функции текущего класса.
- Подавление полиморфного поведения и ссылка на функции текущего класса вместо реализаций, описанных в подклассах;
Недостаток
- Из этих ключевых слов только
это
Для добавления$
Символа и должно быть добавлено, обсессивно-компульсивное расстройство означает очень неудобное; - Не может проходить через статические функции-члены
$this->
Вызывать нестатические функции-члены, но черезself::
Вызывается и не используется в вызывающей функции$this ->
Это также может работать гладко в данных обстоятельствах. Это поведение, по-видимому, ведет себя по-разному в разных версиях PHP, хорошо в текущей версии 7.3; - Вывод в статических и нестатических функциях
self
Угадайте, каков результат? Все онистрока(4) "я"
Вывод тайны; верните $этот экземпляр static::class;
Будут грамматические ошибки, но следующие два способа написания являются нормальными:Так почему же это так?!
Справочные ресурсы
- Когда использовать self за $это?