PHPの静的関数に関する質問があります。
クラスがあると仮定しましょう
class test {
public function sayHi() {
echo 'hi';
}
}
test::sayHi();
を実行すると、問題なく機能します。
class test {
public static function sayHi() {
echo 'hi';
}
}
test::sayHi();
も機能します。
ファーストクラスとセカンドクラスの違いは何ですか?
静的関数の特別な点は何ですか?
最初のクラスでは、sayHi()
は実際には静的メソッドとして呼び出しているインスタンスメソッドであり、sayHi()
は$this
を参照しないため、このメソッドを回避できます。
静的関数は、クラスのインスタンスではなく、クラスに関連付けられています。そのため、$this
は静的コンテキストからは使用できません($this
はオブジェクトを指していません)。
単純に、静的関数はそれらが属するクラスとは独立して機能します。
$ 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'
完全な違いは、静的関数内で$this
が提供されないことです。 $this
を使用しようとすると、Fatal error: Using $this when not in object context
を取得します。
さて、もう1つ違いがあります。最初の例ではE_STRICT
警告が生成されます。
非静的メソッドを静的に呼び出すと、E_STRICTレベルの警告が生成されます。
簡単に言えば、静的メソッドはオブジェクトインスタンスではなくクラスの関数/メソッドであるため、2番目のケースではオブジェクトは$ thisになりません。
例(PHP 5.3.5)を試した後、関数を定義する両方のケースで、$this
演算子を使用してクラス関数を処理できないことがわかりました。ですから、それらの違いをまだ見つけることができませんでした。 :(