1

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

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

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

4

6 回答 6

10

问题还在于,如果您声明 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% 面向对象”(意味着你也可以在类之外有函数)——有这个“特性”:)

于 2009-05-26T20:48:58.533 回答
4

如果我不得不猜测:因为它比其他选择更容易。PHP 中的面向对象支持一直是一个 hack。我隐约记得读过一篇关于即将出现在 PHP 5.3 中的闭包支持的讨论。显然,由于它的作用域规则,在 PHP 中实现词法闭包非常非常困难。可能是因为您可以将一个类嵌套在另一个类的函数中,诸如此类。所有这些自由可能会让这样的事情变得异常困难。

于 2009-05-26T19:42:11.320 回答
3

这并不罕见。Python、Javascript、Perl(和其他)都让你在处理对象时引用一个this或。self

于 2009-05-26T19:49:23.427 回答
1

这就是作用域在 PHP 中的工作方式。$obj->f()$foo在函数范围内。如果要在 中获取类属性$obj->foof()则为$this->foo.

global $foo;
$foo = 99;

class myclass
{
    public $foo;

    function f()
    {
        $this->foo = 12;
        $foo = 7;

        // $this->foo != $foo != $GLOBALS['foo']
    }
}
于 2009-05-26T20:58:00.403 回答
0

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

于 2009-05-26T20:46:43.513 回答
0

似乎 PHP 没有被正确地 OOPed。在 Java 和 C++ 中,对当前对象 ('this') 的引用是隐式的,即不需要明确提及,从而使代码更加简洁。也许有一些原因这对 PHP 实现很困难?

于 2022-02-08T08:35:53.353 回答