- 2007-01-11 (木) 0:21
- PHP
この記事の所要時間: 約 1分7秒
PHPで関数をネストして定義できるんですね。知りませんでした。
<?php function func() { function inner_func() { echo 'inner_func' . PHP_EOL; } inner_func(); echo 'func' . PHP_EOL; } func(); /* output inner_func func */ ?>
メソッド内でもネストできます。
<?php class Hoge { function method() { function inner_method() { echo 'inner_method' . PHP_EOL; } inner_method(); echo 'method' . PHP_EOL; } } $obj = new Hoge; $obj->method(); /* output inner_method method */ ?>
無意味ですがこんな事もできます。
<?php function func() { function inner_func() { function inner_inner_func() { function inner_inner_inner_func() { echo 'inner_inner_inner_func' . PHP_EOL; } inner_inner_inner_func(); echo 'inner_inner_func' . PHP_EOL; } inner_inner_func(); echo 'inner_func' . PHP_EOL; } inner_func(); echo 'func' . PHP_EOL; } func(); /* output inner_inner_inner_func inner_inner_func inner_func func */ ?>
注意点ですが、ネスト関数を呼び出す際はネスト関数の定義後でないとFatal errorが発生します。
function func() { inner_func(); // Fatal error function inner_func() { } inner_func(); // ok }
さて関数(メソッド)内に定義されているネスト関数ですが、スコープはどうなっているのでしょうか。見た目からすると定義されている関数内でのみ使用可能なように見えるのですが、実は通常の関数と同じくグローバルスコープになっています。
<?php class Hoge { function method() { function inner_method() { echo 'inner_method' . PHP_EOL; } inner_method(); echo 'method' . PHP_EOL; } } $obj = new Hoge; $obj->method(); inner_method(); // ここでも呼べる /* output inner_method method inner_method */ ?>
ネスト関数を異なるクラスのメソッド内に定義しても名前空間は同じです。関数名がぶつからないようにする必要があります。(PHP4.3.0以降)
うーん、使いどころがあるような無いような。。。メソッド内で関数を動的に定義する時なんかは使えるかも。
参照:PHPマニュアル-関数
- Newer: 法人の確定申告
- Older: CakePHP 1.1環境で1.2を試す
トラックバック:0
- このエントリーのトラックバックURL
- /blog/2007/01/php_nested_function.html/trackback
- Listed below are links to weblogs that reference
- ネストした関数 from Shin x blog