Home > PHP > ネストした関数

ネストした関数

  • 2007-01-11 (木) 0:21
  • PHP
この記事の所要時間: 17

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マニュアル-関数

Pocket

follow us in feedly

トラックバック: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