我正在向 Java 开发人员解释为什么他的方法调用不起作用。他只需要添加$this->method_name();
然后他问我,“为什么我需要在同一个类中声明的方法中添加$this?”
我真的不知道该怎么回答。也许是因为 PHP 有一个全局命名空间,你需要明确告诉它你要查找的方法属于当前类?但是为什么 PHP 在查看全局命名空间之前不检查当前类的方法呢?
问题还在于,如果您声明 afunction foo()
和 a method 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 中的面向对象支持一直是一个 hack。我隐约记得读过一篇关于即将出现在 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 文档有很好的例子和更多细节。
似乎 PHP 没有被正确地 OOPed。在 Java 和 C++ 中,对当前对象 ('this') 的引用是隐式的,即不需要明确提及,从而使代码更加简洁。也许有一些原因这对 PHP 实现很困难?