Почему использование $ this в PHP необходимо при ссылке на методы или переменные в одном классе?

Я объяснял разработчику Java, почему его вызов метода не работал. Ему просто нужно было добавить $this->method_name();

Затем он спросил меня: «Почему мне нужно добавить $ this к методу, когда он объявлен в том же классе?»

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

Проблема также заключалась бы в том, что если бы вы объявили function foo() и метод foo() , php затруднился бы выяснить, что вы имели в виду, – рассмотрите этот пример:

 <?php function foo() { echo 'blah'; } class bar { function foo() { echo 'bleh'; } function bar() { // Here, foo() would be ambigious if $this-> wasn't needed. } } ?> 

Поэтому в основном вы можете сказать, что PHP – из-за своей «не-100% -объектной-ориентированности» (что означает, что вы также можете иметь функции вне классов) – имеет эту «особенность» 🙂

Если я должен угадать: потому что это было проще, чем альтернативы. Объектно-ориентированная поддержка в PHP всегда была очень сложной. Я смутно помню, как читал дискуссию о предстоящей поддержке закрытия, которая появится в PHP 5.3. По-видимому, действительно было очень сложно реализовать лексические закрытия в PHP из-за его правил определения области видимости. Вероятно, потому что вы можете вложить класс в функцию в другом классе и так далее. Вся эта свобода делает такие вещи невероятно трудными.

Это не редкость. Python, Javascript, Perl (и другие) заставляют вас ссылаться на this или на self при работе с объектами.

Вот как работает область действия PHP. $obj->f() относится к $foo в области функций. Если вы хотите получить свойство класса $obj->foo внутри f() , это $this->foo .

 global $foo; $foo = 99; class myclass { public $foo; function f() { $this->foo = 12; $foo = 7; // $this->foo != $foo != $GLOBALS['foo'] } } 

$ this относится к вызывающему объекту. В документах PHP есть хорошие примеры и дальнейшие подробности.