無名関数
無名関数は 無名関数の実装には Closure クラスを使っています。 例1 無名関数の例
クロージャは、変数の値として使用することもできます。 PHP は、そのような記述があると自動的に内部クラス Closure のインスタンスに変換します。 変数へのクロージャの代入は、他の代入と同じように記述し、 同じく最後にセミコロンをつけます。 例2 変数への無名関数の代入
クロージャは、変数を親のスコープから引き継ぐことができます。
引き継ぐ変数は、 例3 親のスコープからの変数の引き継ぎ
上の例の出力は、 たとえば以下のようになります。 Notice: Undefined variable: message in /example.php on line 6 NULL string(5) "hello" string(5) "hello" string(5) "hello" string(5) "world" string(11) "hello world" string(11) "hello world" PHP 8.0.0 以降では、親のスコープを継承した変数の一覧の最後にカンマを付けられるようになりました。 このカンマは無視されます。 親のスコープからの変数の引き継ぎは、グローバル変数を使うのとは 異なります。グローバル変数は、 関数が実行されるかどうかにかかわらずグローバルスコープに存在します。 クロージャの親スコープは、クロージャが宣言されている関数です (関数の呼び出し元のスコープである必要はありません)。 次の例を参照ください。 例4 クロージャのスコープ
例5
上の例の出力は以下となります。 object(Test)#1 (0) { }
クラスのコンテキストで宣言した場合は、現在のクラスが自動的にバインドされて、
関数のスコープで static な無名関数static を付けて無名関数を宣言することができます。 こうすることで、現在のクラスが無名関数を自動的にバインドすることがなくなります。 オブジェクトも、実行時にはバインドされなくなります。
例6 static な無名関数内での
上の例の出力は以下となります。 Notice: Undefined variable: this in %s on line %d NULL
例7 static な無名関数へのオブジェクトのバインド
上の例の出力は以下となります。 Warning: Cannot bind an instance to a static closure in %s on line %d 注意
|