Почему использование $ this в PHP необходимо при обращении к методам или переменным в одном классе? - PullRequest
1 голос
/ 26 мая 2009

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

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

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

Ответы [ 5 ]

9 голосов
/ 27 мая 2009

Проблема также заключается в том, что если вы объявите 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% -объектной ориентированности" (что означает, что вы также можете иметь функции вне классов) - имеет эту "особенность":)

4 голосов
/ 26 мая 2009

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

3 голосов
/ 26 мая 2009

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

1 голос
/ 27 мая 2009

Вот как работает видимость в 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']
    }
}
0 голосов
/ 27 мая 2009

$ это относится к вызывающему объекту. Документы PHP содержат хорошие примеры и дополнительную информацию.

...