web-dev-qa-db-ja.com

php静的関数

PHPの静的関数に関する質問があります。

クラスがあると仮定しましょう

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

test::sayHi();を実行すると、問題なく機能します。

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

test::sayHi();も機能します。

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

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

103
Moon

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

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

147

単純に、静的関数はそれらが属するクラスとは独立して機能します。

$ thisは、これがこのクラスのオブジェクトであることを意味します。静的関数には適用されません。

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'
21
user2132859

完全な違いは、静的関数内で$thisが提供されないことです。 $thisを使用しようとすると、Fatal error: Using $this when not in object contextを取得します。

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

20
chaos

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

3
user2598812

簡単に言えば、静的メソッドはオブジェクトインスタンスではなくクラスの関数/メソッドであるため、2番目のケースではオブジェクトは$ thisになりません。

2
Czimi

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

1
yogesh