我向Java开发人员解释为什么他的方法调用不起作用。他只需要添加$this->method_name();
然后他问我,“为什么我需要在同一个类中声明方法时将 $ this 添加到方法中?”
我真的不知道如何回答。也许是因为PHP有一个全局命名空间,你需要明确地告诉它你要找的方法属于当前的类吗?但是为什么PHP在查看全局命名空间之前不检查方法的当前类?
答案 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(和其他)都可以让你在处理对象时引用this
或self
。
答案 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有很好的例子和更多细节。