110

PHPの静的関数について質問があります。

私がクラスを持っていると仮定しましょう

class test {
    public function sayHi() {
        echo 'hi';
    }
}

私がやればtest::sayHi();問題なく動作します。

class test {
    public static function sayHi() {
        echo 'hi';
    }
}

test::sayHi();同様に動作します。

ファーストクラスとセカンドクラスの違いは何ですか?

静的関数の何が特別なのですか?

4

6 に答える 6

157

最初のクラスでは、sayHi()は実際には静的メソッドとして呼び出しているインスタンスメソッドであり、をsayHi()参照することはないため、これを回避し$thisます。

静的関数は、クラスのインスタンスではなく、クラスに関連付けられています。そのため$this、静的コンテキストからは利用できません($thisオブジェクトを指していません)。

于 2009-05-24T02:20:02.807 に答える
22

Simply, static functions function independently of the class where they belong.

$this means, this is an object of this class. It does not apply to static functions.

class test {
    public function sayHi($hi = "Hi") {
        $this->hi = $hi;
        return $this->hi;
    }
}
class test1 {
    public static function sayHi($hi) {
        $hi = "Hi";
        return $hi;
    }
}

//  Test
$mytest = new test();
print $mytest->sayHi('hello');  // returns 'hello'
print test1::sayHi('hello');    //  returns 'Hi'
于 2013-08-27T15:36:06.177 に答える
20

$this全体的な違いは、静的関数内では提供されないということです。を使おうとすると$this、が表示されますFatal error: Using $this when not in object context

さて、もう1つの違いE_STRICTは、最初の例で警告が生成されることです。

于 2009-05-24T02:15:02.830 に答える
4

非静的メソッドを静的に呼び出すと、E_STRICT レベルの警告が生成されます。

于 2014-09-02T18:40:32.567 に答える
2

一言で言えば、静的メソッドはオブジェクトインスタンスではなくクラスの関数/メソッドであるため、2番目のケースでは$thisとしてオブジェクトを持っていません。

于 2009-05-24T02:17:28.380 に答える
1

$this例 (PHP 5.3.5) を試した後、関数を定義する両方のケースで、演算子を使用してクラス関数を操作できないことがわかりました。だから私はまだそれらの違いを見つけることができませんでした. :(

于 2011-12-30T07:52:02.610 に答える