[PHP-users 12916] Re: 制御構文内での関数定義について

Moriyoshi Koizumi php-users@php.gr.jp
Fri, 31 Jan 2003 16:56:10 +0900


小泉です。

うーん、おそらくドキュメントの不備ですね。

inner statement ("{" "}" でくくられている個所) での関数定義は
ランタイムで行われるので、順序が重要になります。

> http://www.php.net/manual/ja/functions.php#functions.user-defined
> PHP 3 では、関数は参照される前に定義されている必要がありました。
> PHP 4ではそのような制限はありません。

このくだりは、トップレベルでの関数定義はコンパイルタイムで行われるため、
実行時に定義された順序を気にする必要はない、という意味です。

念のため触れておきますと、PHP はスクリプト言語なので、この「コンパイル」とい
う言葉に違和感を覚えるかもしれませんが、ZendEngine は、速度を稼ぐため、まず
はじめにスクリプトを中間コードに変換してから実行するようになっているため、
このような区別が生じています。

<?php
  { // ここ
     foo();
     function foo() {
       echo "!";
     }
  } // ここ
?>

「ここ」と書かれた部分をコメントアウトした場合とそうでない場合で実行結果が異
なるのはそういう理由からです。