Предисловие
Некоторые люди в группе PHP спрашивают об использовании ключевого слова self, ответ очевиден: статические функции-члены не могут использовать его для вызова функций, не являющихся членами, но могут использовать self для вызова статических функций-членов/переменных/констант; другие функции-члены могут использовать self для вызова статических функций-членов и нестатических функций-членов. По мере углубления дискуссии выяснилось, что ” я ” не так просто. В связи с этим в данной статье сначала сравнивается и различается несколько ключевых слов, а затем обобщается использование self.
Дифференциация от родительской, статической и этой
Чтобы досконально понять себя, отличите его от родителя, статичного и этого. Делаются следующие сравнения.
родитель
Различие между self и parent легко: parent ссылается на метод (или переменную), родительский/базовый класс которого скрыт, в то время как 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: статическая отложенная привязка.
С помощью статической функции отложенной привязки static классы, принадлежащие к ним, могут определяться динамически во время выполнения. Например:
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();
Вывод программы выглядит следующим образом:
Конструктор базы! Детский конструктор! База Фу! Ребенок Фу! Ребенок Фу!
В ссылках на функции разница между self и static заключается в том, что для статических функций-членов self указывает на текущий класс кода, а static указывает на вызывающий класс; для нестатических функций-членов self подавляет полиморфизм и указывает на функцию-член текущего класса. Статика эквивалентна этому и динамически указывает на функцию вызывающего класса.
Три ключевых слова “родитель”, ” я ” и “статика” интересно видеть вместе. Они указывают на родительский класс, текущий класс и подкласс соответственно. У них есть вкус “прошлого, настоящего и будущего”.
этот
Я и это наиболее обсуждаемые и неправильно используемые комбинации. Основные различия между ними заключаются в следующем:
- Это нельзя использовать в статических функциях-членах, self может;
- Для доступа к статическим функциям-членам/переменным рекомендуется использовать self вместо $this:: или $this->.
- Для доступа к нестатическим переменным-членам мы можем использовать только это вместо self.
- Это используется, когда объект был создан, и self не имеет такого ограничения.
- При использовании в нестатических функциях-членах self подавляет полиморфизм и ссылается на функции текущего класса, в то время как это относится к функциям переопределения вызывающего класса, если таковые имеются.
Использование собственного
После рассмотрения различий между тремя ключевыми словами, упомянутыми выше, сразу ли становится очевидным использование self? В заключение, self всегда указывает на “текущий класс (и экземпляр класса)”. В деталях это:
- Замените имя класса ссылкой на статические переменные-члены и статические функции текущего класса.
- Подавление полиморфного поведения и ссылка на функции текущего класса вместо реализаций, описанных в подклассах;
Недостаток
- Среди этих ключевых слов только это должно быть добавлено символом$, и обсессивно-компульсивное расстройство очень неудобно.
- Статическая функция-член не может вызывать нестатическую функцию-член с помощью $this – >, но ее можно вызвать с помощью self:: и она может работать плавно без использования $this – > в вызывающей функции. Это поведение, по-видимому, ведет себя по-разному в разных версиях PHP, хорошо в текущей версии 7.3;
- Выводите себя в статических и нестатических функциях. Угадайте, каков результат? Это все строка (4) “я”, вывод тайны;
- Верните $этот экземпляр static:: class; будут грамматические ошибки, но следующие два способа написания являются нормальными:
$class = static::class; return $this instanceof $class; // Or so: return $this instanceof static;
Так почему же это так?!
Справочные ресурсы
Когда использовать self за $это?
резюме
Выше приведено все содержание этой статьи. Я надеюсь, что содержание этой статьи имеет какое-то справочное значение для вашей учебы или работы. Спасибо вам за вашу поддержку в развитии peer.