Как нестатический метод класса вызывается статически из метода другого другого класса, не создавая объект первого?

я использую 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 Вот)?

Благодарю вас.

0

Решение

Примечание: PHP очень слабый с использованием статических и нестатических методов.

Но: методы, которые не являются статичными, НЕ должны вызываться статически (даже если PHP толерантный). Зачем?

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

Иногда нестатический метод не зависит от экземпляра, и поэтому программа все еще работает, потому что этот метод может быть статическим. Но ты никогда не должен делать это.

Более того — если вы включите отчеты об ошибках, PHP также скажет вам следующее:

$ это определено (A)
Устаревшие: Нестатический метод
A :: foo () не должен вызываться статически в […] […] онлайн
25
$ это не определено.
Устаревшие:
Нестатический метод A :: foo () не должен вызываться статически в
[…] […] онлайн 18
$ это не определено.
Устаревшие: Нестатический метод B :: bar () не должен вызываться
статически в […] […] онлайн 29

Устаревшие: Нестатический метод A :: foo () не должен вызываться
статически в […] […] онлайн 18
$ это не
определены.

Устаревший также означает: Просто потому, что PHP все еще позволяет это, он, скорее всего, будет удален в будущих обновлениях PHP.

3

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

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

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