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

Youichi Iwakiri php-users@php.gr.jp
Fri, 31 Jan 2003 17:17:16 +0900


Seto wrote in <6C2C8FB02C72Fseto@cii.gr.jp> :
>テスト用スクリプトを作成していて
>記載コードのように制御構文内に関数を定義してしまったのですが
>submitボタンクリック後に
>Call to undefined function: functest1()
>とエラーが出てしまいました。

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

>とあるだけなのですが、どのように解釈すべきでしょうか?

ソースを追ったわけじゃないですけど、
ブロック内での関数定義は、実行時に評価され、ファンクションテーブルに
登録されている様な気がします。

また、ブロック内で定義された関数であっても、グローバルレンジで
呼び出せます。
参照されたマニュアルページに以下も書かれていますので
> PHP は関数のオーバーロードをサポートしていません。 また、宣言された
> 関数の定義を取り消したり再定義することも できません。

別ブロックで同一の名称を持つ関数を定義する事自体ができませんので
素直にグローバルレンジで定義するしかないと思います。

また、include, requireで読み込むスクリプトの関数を使うには、
呼び出し前に、include, requireが必要です。
ZendEngineにより実行前にコンパイルされますが、
C言語等の様に、プリコンパイルフェーズで全てのソースを結合し
単一のソースを生成することで、前方参照を可能としますが、
PHPは、ファイル単位でコンパイルし、require, include文の実行時に
対象をコンパイルします。

#肝心なブロック内の問題は、使わない方向で対処するってのはどうですか?

-- 
Youichi Iwakiri