为什么在引用同一类中的方法或变量时,必须在PHP中使用$ this?

时间:2009-05-26 19:36:53

标签: php oop this

我向Java开发人员解释为什么他的方法调用不起作用。他只需要添加$this->method_name();

然后他问我,“为什么我需要在同一个类中声明方法时将 $ this 添加到方法中?”

我真的不知道如何回答。也许是因为PHP有​​一个全局命名空间,你需要明确地告诉它你要找的方法属于当前的类吗?但是为什么PHP在查看全局命名空间之前不检查方法的当前类?

5 个答案:

答案 0 :(得分:9)

问题还在于,如果你声明了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% - 对象导向”(意味着你也可以在课外有函数) - 有这个“功能”:)

答案 1 :(得分:4)

如果我不得不猜测:因为它比替代品更容易。 PHP中面向对象的支持一直非常糟糕。我依稀记得阅读有关将在PHP 5.3中出现的即将到来的关闭支持的讨论。显然,由于它的范围规则,在PHP中实现词法闭包确实非常非常困难。可能是因为你可以在一个函数中将一个类嵌套在另一个类中,就像那样。所有这些自由都可能让这样的事情难以置信。

答案 2 :(得分:3)

这并不罕见。 Python,Javascript,Perl(和其他)都可以让你在处理对象时引用thisself

答案 3 :(得分:1)

这就是范围在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']
    }
}

答案 4 :(得分:0)

$ this指的是调用对象。 PHP docs有很好的例子和更多细节。