1

メソッド呼び出しが機能しない理由を Java 開発者に説明していました。彼はただ追加する必要がありました$this->method_name();

それから彼は私に、 「同じクラスで宣言されているのに、なぜメソッドに$thisを追加する必要があるのですか?」と尋ねました。

どう答えたらいいのかさっぱりわからなかった。おそらく、PHP にはグローバルな名前空間があり、探しているメソッドが現在のクラスに属していることを明示的に伝える必要があるためでしょうか? しかし、グローバル名前空間を確認する前に、なぜ PHP はメソッドの現在のクラスをチェックしないのでしょうか?

4

6 に答える 6

10

function foo()問題は、 aおよび 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 でのオブジェクト指向のサポートは、常にハックのようなものでした。PHP 5.3 で登場するクロージャのサポートについての議論を読んだことを漠然と覚えています。どうやら PHP でレキシカル クロージャを実装するのは、スコープ ルールが原因で非常に困難だったようです。おそらく、クラスを別のクラスの関数にネストできるためなどです。その自由のすべてが、このようなものを信じられないほど困難にする可能性があります。

于 2009-05-26T19:42:11.320 に答える
3

これは珍しいことではありません。Python、Javascript、Perl (およびその他) はすべて、オブジェクトを扱うときにthisorを参照するようにします。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 に答える