Почему PHP поддерживает вызов статических функций как нестатических методов-членов? - PullRequest
0 голосов
/ 23 октября 2018

Код заранее полностью действительный код из 5.0.0 (без E_STRICT или E_DEPRECATED)

class A{
    static public function b() {
    }

    public function c(){
        $this->b();
    }
}

$d = new A();
$d->c();
$d->b();

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

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

Но я не могу найти ни одного языка программирования, поддерживающего подобное поведение.

Почему PHP поддерживаетэто? Какой смысл называть статические методы нестатичными?

Некоторое объяснение от поддержки: Ожидаемое поведение

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

На самом деле, C ++ и Java поддерживают это.Похоже, что разработчики PHP после обсуждения решили, что реализация будет соответствовать им.

После небольшого копания я нашел эту ветку от февраля 2004 года, что по сути является их обсуждением о реализациивыбор.Важные подробности из обсуждения:

От Криштиану Дуарте :

C ++ допускает $ a-> bar (), когда bar () является статическимметод (да, он также вызывается в статическом контексте).

ИМО, здесь не должно быть ошибок, предупреждений или уведомлений.

Согласен.PHP в порядке.

Из Art :

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

И для чего бы это ни стоило, я не вижу причин, почему статические методы нельзя вызывать из объектов.В этом случае следуйте Java / C ++.

В конечном итоге, окончательное решение От Wez :

Пожалуйста, прекратите эту ветку;мы не меняем поведение статики.

0 голосов
/ 23 октября 2018

Мне кажется, что здесь рассматривается только синтаксис.Ничто здесь не противоречит логике статических методов, все еще невозможно использовать $this в вашей статической функции, и, следовательно, функция не будет иметь доступа к свойствам или методам экземпляра.Для меня это больше похоже на ярлык, чем на несоответствие.

У меня нет этого варианта использования, но я думаю, что кто-то может найти его полезным для объектов, созданных с динамическими именами классов: вы все равно можете использовать функцию, даже еслиВы не знаете, это имя класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...