Home > PHP > ネストした関数

ネストした関数

  • 2007-01-11 (木) 0:21
  • PHP
  • このエントリーをはてなブックマークに追加
この記事の所要時間: 17

PHPで関数をネストして定義できるんですね。知りませんでした。

PHP:
  1. <?php
  2. function func() {
  3.   function inner_func() {
  4.     echo 'inner_func' . PHP_EOL;
  5.   }
  6.  
  7.   inner_func();
  8.   echo 'func' . PHP_EOL;
  9. }
  10.  
  11. func();
  12.  
  13. /* output
  14. inner_func
  15. func
  16. */
  17. ?>

メソッド内でもネストできます。

PHP:
  1. <?php
  2. class Hoge {
  3.   function method() {
  4.     function inner_method() {
  5.       echo 'inner_method' . PHP_EOL;
  6.     }
  7.  
  8.     inner_method();
  9.     echo 'method' . PHP_EOL;
  10.   }
  11. }
  12.  
  13. $obj = new Hoge;
  14. $obj->method();
  15.  
  16. /* output
  17. inner_method
  18. method
  19. */
  20. ?>

無意味ですがこんな事もできます。

PHP:
  1. <?php
  2. function func() {
  3.   function inner_func() {
  4.     function inner_inner_func() {
  5.       function inner_inner_inner_func() {
  6.         echo 'inner_inner_inner_func' . PHP_EOL;
  7.       }
  8.       inner_inner_inner_func();
  9.       echo 'inner_inner_func' . PHP_EOL;
  10.     }
  11.     inner_inner_func();
  12.     echo 'inner_func' . PHP_EOL;
  13.   }
  14.  
  15.   inner_func();
  16.   echo 'func' . PHP_EOL;
  17. }
  18.  
  19. func();
  20.  
  21. /* output
  22. inner_inner_inner_func
  23. inner_inner_func
  24. inner_func
  25. func
  26. */
  27. ?>

注意点ですが、ネスト関数を呼び出す際はネスト関数の定義後でないとFatal errorが発生します。

PHP:
  1. function func() {
  2.   inner_func(); // Fatal error
  3.   function inner_func() {
  4.   }
  5.   inner_func(); // ok
  6. }

さて関数(メソッド)内に定義されているネスト関数ですが、スコープはどうなっているのでしょうか。見た目からすると定義されている関数内でのみ使用可能なように見えるのですが、実は通常の関数と同じくグローバルスコープになっています。

PHP:
  1. <?php
  2. class Hoge {
  3.   function method() {
  4.     function inner_method() {
  5.       echo 'inner_method' . PHP_EOL;
  6.     }
  7.  
  8.     inner_method();
  9.     echo 'method' . PHP_EOL;
  10.   }
  11. }
  12.  
  13. $obj = new Hoge;
  14. $obj->method();
  15.  
  16. inner_method(); // ここでも呼べる
  17.  
  18. /* output
  19. inner_method
  20. method
  21. inner_method
  22. */
  23. ?>

ネスト関数を異なるクラスのメソッド内に定義しても名前空間は同じです。関数名がぶつからないようにする必要があります。(PHP4.3.0以降)

うーん、使いどころがあるような無いような。。。メソッド内で関数を動的に定義する時なんかは使えるかも。

参照:PHPマニュアル-関数

トラックバック:0

このエントリーのトラックバックURL
http://www.1x1.jp/blog/2007/01/php_nested_function.html/trackback
Listed below are links to weblogs that reference
ネストした関数 from Shin x blog

Home > PHP > ネストした関数

検索
フィード
メタ情報

Return to page top