| ユーザフォーラムで議論/質問 | マニュアル検索 | ハイライト | ハイライトオフ | ポータル | php spot |
無名関数無名関数はクロージャとも呼ばれ、 関数名を指定せずに関数を作成できるようにするものです。 コールバック パラメータとして使う際に便利ですが、用途はそれにとどまりません。 無名関数の実装には Closure クラスを使っています。 例1 無名関数の例
<?php クロージャは、変数の値として使用することもできます。 PHP は、そのような記述があると自動的に内部クラス Closure のインスタンスに変換します。 変数へのクロージャの代入は、他の代入と同じように記述し、 同じく最後にセミコロンをつけます。 例2 変数への無名関数の代入
<?php クロージャは、変数を親のスコープから引き継ぐことができます。 引き継ぐ変数は、use で渡さなければなりません。 From PHP 7.1, these variables must not include superglobals, $this, or variables with the same name as a parameter. 例3 親のスコープからの変数の引き継ぎ
<?php 上の例の出力は、 たとえば以下のようになります。 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" 親のスコープからの変数の引き継ぎは、グローバル変数を使うのとは 異なります。グローバル変数は、 関数が実行されるかどうかにかかわらずグローバルスコープに存在します。 クロージャの親スコープは、クロージャが宣言されている関数です (関数の呼び出し元のスコープである必要はありません)。 次の例を参照ください。 例4 クロージャのスコープ
<?php 例5 $this の自動バインド
<?php 上の例の出力は以下となります。 object(Test)#1 (0) { } 上の例の PHP 5.3 での出力は、このようになります。 Notice: Undefined variable: this in script.php on line 8 NULL PHP 5.4.0 以降では、クラスのコンテキストで宣言した場合は現在のクラスが自動的にバインドされて、 関数のスコープで $this が使えるようになります。 現在のクラスへの自動バインドを望まない場合は、 静的無名関数 を使いましょう。 静的無名関数PHP 5.4 以降では、静的な無名関数を宣言できるようになりました。 こうすれば、現在のクラスが無名関数を自動的にバインドすることがなくなります。 オブジェクトも、実行時にはバインドされなくなります。
例6 静的無名関数内での $this の使用例
<?php 上の例の出力は以下となります。 Notice: Undefined variable: this in %s on line %d NULL
例7 静的無名関数へのオブジェクトのバインド
<?php 上の例の出力は以下となります。 Warning: Cannot bind an instance to a static closure in %s on line %d 変更履歴
注意
|
各種マニュアル:
PHPマニュアル |
PEARマニュアル |
Smarty(英語)マニュアル |
PHP-GTKマニュアル |
「無名関数」をGoogle検索
|