Какой вариант должен быть выбран в этом контексте, self, static или this. Есть ли какая-то разница?

Документы PHP объясняют об операторе разрешения области (: :), что он предназначен для использования в основном в статических контекстах наряду с self, static и parent.

Но затем вы обнаружите, что можно использовать его вместо $ this независимо от статического контекста или нет, как в этом примере:

class A {
public function funA() {
self::funB();  // *Works*
static::funB();   // *Works*
$this->funB();  // *Works*
}
public function funB() {
}
}

Это проблема дизайна PHP или я что-то неправильно понимаю? Я нахожу, что использование ::, static и self немного сбивает с толку … Когда выбрать один или другой?

1

Решение

Руководство PHP объяснило это в Поздние статические привязки хотя, возможно, это не так кратко, как должно быть.
Позвольте мне предложить свое собственное объяснение.

Вот руководство:

  • self всегда относится к классу, где слово self появляется.
  • static всегда ссылается на текущий класс в статическом контексте, даже если класс расширен.
  • $this всегда ссылается на текущий класс в контексте объекта, даже если класс расширен.

Как показано в следующем примере, используйте self если вы хотите всегда ссылаться на класс А,
использование static а также $this если вы хотите всегда ссылаться на класс B, когда B является текущим классом.

class A {
public function test() {
echo self::who();   // always class A
echo static::who(); // always the current class (static context)
echo $this->who();  // always the current class (object context)
}
public function who() {
echo __CLASS__ . "\n";
}
}

class B extends A {
public function who() {
echo __CLASS__ . "\n";
}
}

(new B)->test();

Выход:

A
B
B

Как вы видете, static а также $this относятся к тому же классу (класс B).
Давайте расширим пример другим классом, который расширяет класс B:

class C extends B {
public function who() {
echo __CLASS__ . "\n";
}
}

(new C)->test();

Выход:

A
C
C

Заметить, что static а также $this обратиться к тому же классу снова, класс C на этот раз,
так как static а также $this всегда обращайтесь к текущему классу, даже если класс расширен.

Так в чем же разница между static а также $this?
Разница заключается в контексте.
$this требует объект (экземпляр класса), в то время как static не.

Посмотрим что будет если test() вызывается в статическом контексте:

C::test();

Выход:

A
C

Fatal error: Using $this when not in object context in C:\wamp\www\test.php on line 7

Первый и второй вызовы прекрасно работают в статическом контексте, но третий вызов не выполняется, потому что $this требует контекст объекта.
Смотрите код в действии на https://ideone.com/AVtITz

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]