Рубрики
Uncategorized

Подробное объяснение ключевого слова Self в PHP

Автор оригинала: David Wong.

Предисловие

Некоторые люди в группе 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 подавляет полиморфизм и указывает на функцию-член текущего класса. Статика эквивалентна этому и динамически указывает на функцию вызывающего класса.

Три ключевых слова “родитель”, ” я ” и “статика” интересно видеть вместе. Они указывают на родительский класс, текущий класс и подкласс соответственно. У них есть вкус “прошлого, настоящего и будущего”.

этот

Я и это наиболее обсуждаемые и неправильно используемые комбинации. Основные различия между ними заключаются в следующем:

  1. Это нельзя использовать в статических функциях-членах, self может;
  2. Для доступа к статическим функциям-членам/переменным рекомендуется использовать self вместо $this:: или $this->.
  3. Для доступа к нестатическим переменным-членам мы можем использовать только это вместо self.
  4. Это используется, когда объект был создан, и self не имеет такого ограничения.
  5. При использовании в нестатических функциях-членах self подавляет полиморфизм и ссылается на функции текущего класса, в то время как это относится к функциям переопределения вызывающего класса, если таковые имеются.

Использование собственного

После рассмотрения различий между тремя ключевыми словами, упомянутыми выше, сразу ли становится очевидным использование self? В заключение, self всегда указывает на “текущий класс (и экземпляр класса)”. В деталях это:

  1. Замените имя класса ссылкой на статические переменные-члены и статические функции текущего класса.
  2. Подавление полиморфного поведения и ссылка на функции текущего класса вместо реализаций, описанных в подклассах;

Недостаток

  1. Среди этих ключевых слов только это должно быть добавлено символом$, и обсессивно-компульсивное расстройство очень неудобно.
  2. Статическая функция-член не может вызывать нестатическую функцию-член с помощью $this – >, но ее можно вызвать с помощью self:: и она может работать плавно без использования $this – > в вызывающей функции. Это поведение, по-видимому, ведет себя по-разному в разных версиях PHP, хорошо в текущей версии 7.3;
  3. Выводите себя в статических и нестатических функциях. Угадайте, каков результат? Это все строка (4) “я”, вывод тайны;
  4. Верните $этот экземпляр static:: class; будут грамматические ошибки, но следующие два способа написания являются нормальными:
$class = static::class;
return $this instanceof $class;
// Or so:
return $this instanceof static;

Так почему же это так?!

Справочные ресурсы

Когда использовать self за $это?

резюме

Выше приведено все содержание этой статьи. Я надеюсь, что содержание этой статьи имеет какое-то справочное значение для вашей учебы или работы. Спасибо вам за вашу поддержку в развитии peer.