я использую PHP 7.1.11
Рассмотрим код ниже:
<?php
class A {
function foo() {
if (isset($this)) {
echo '$this is defined (';
echo get_class($this);
echo ")\n";
} else {
echo "\$this is not defined.\n";
}
}
}
class B {
function bar() {
A::foo();
}
}
$a = new A();
$a->foo();
A::foo();
$b = new B();
$b->bar();
B::bar();
?>
Вывод вышеуказанного кода:
$this is defined (A)
$this is not defined.
$this is not defined.
$this is not defined.
За исключением первой строки в выходных данных следующие три строки выходных данных были сгенерированы путем вызова нестатического метода foo()
который присутствует в class A
статически (т.е. без создания объекта class A
).
Кто-нибудь, пожалуйста, объясните мне, как это происходит?
Как нестатический метод из другого класса вызывается статически из класса / объекта рассматриваемого класса (т.е. class B
Вот)?
Благодарю вас.
Примечание: PHP очень слабый с использованием статических и нестатических методов.
Но: методы, которые не являются статичными, НЕ должны вызываться статически (даже если PHP толерантный). Зачем?
Если метод не является статическим, это обычно означает, что он зависит от состояния экземпляра, потому что в противном случае он можно сделать статичным.
Иногда нестатический метод не зависит от экземпляра, и поэтому программа все еще работает, потому что этот метод может быть статическим. Но ты никогда не должен делать это.
Более того — если вы включите отчеты об ошибках, PHP также скажет вам следующее:
$ это определено (A)
Устаревшие: Нестатический метод
A :: foo () не должен вызываться статически в […] […] онлайн
25
$ это не определено.
Устаревшие:
Нестатический метод A :: foo () не должен вызываться статически в
[…] […] онлайн 18
$ это не определено.
Устаревшие: Нестатический метод B :: bar () не должен вызываться
статически в […] […] онлайн 29Устаревшие: Нестатический метод A :: foo () не должен вызываться
статически в […] […] онлайн 18
$ это не
определены.
Устаревший также означает: Просто потому, что PHP все еще позволяет это, он, скорее всего, будет удален в будущих обновлениях PHP.
Других решений пока нет …