Документы 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 немного сбивает с толку … Когда выбрать один или другой?
Руководство 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
Других решений пока нет …