PHP静的関数


108

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

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

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

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

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

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

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

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


15
php7以降、非静的メソッドを静的に呼び出すことはできません
sanjay yadav

回答:


153

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

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


22
現在、非静的メソッドの静的呼び出しは機能しますが、非推奨です。インスタンスメソッドにこの構文を使用する場合は注意してください。
ジェット

1
それで、なぜ彼らはそれを静的関数と言うのですか?動的なデータフローと動的な出力を持つ複数のインスタンスがないためです。ちょうど私を導いてください。@ chaos

22

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

$ 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'

9
OK私はPHPウィザードではありませんが、静的関数に渡される変数( 'hello')ではなく、明示的に 'Hi'で上書きされていますか?行がtest1 :: sayHi( 'hello');を出力することを意味します。「こんにちは」は返されませんが、「こんにちは」は返されますか?
Fnord23、2015年

6
この答えはずさんであり(静的関数の効果はそれらがどのクラスに属しているかに依存する可能があります)、例はポイントを明確にしていません。
reinierpost 2016年

あまり良い例ではありません。$ hi = 'こんにちは'; 与えられた引数を上書きし、静的宣言とは何の関係もありません。私はこれを次のように修正します:self :: $ hi = $ hi; そして、それは非静的なものと同じように機能します。$ this->の代わりにself ::を使用してクラス変数にアクセスできます
GotBatteries

20

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

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


1
最初に使用するときに警告はありませんが、php7を使用しています
アシュカンナシルザデ

静的関数内に$ thisがないのはなぜですか?これのアーキテクチャロジックは何ですか?ありがとう。
ルーカスブスタマンテ

@LucasBustamante:$this現在のオブジェクトを参照します。静的関数では、現在のオブジェクトはありません。関数はクラス上に存在し、そのクラスのオブジェクトインスタンスを必要とせず、参照もしません。
混乱

3

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


2

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


1
静的なのは、単にクラス関数を定義する方法ですか?他の派手なビジネスはありませんか?つまり、「静的」ではなく「class_method」と呼ばれていた場合、よりセマンティックになりますか?
ahnbizcad 2015年

1

例(PHP 5.3.5)を試した後、関数を定義するどちらの場合でも、$this演算子を使用してクラス関数を操作できないことがわかりました。そのため、まだ違いを見つけることができませんでした。:(

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.