- 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

