有名な話だと思いますが,自分用まとめです.途中で気になって内部仕様について深堀りもしましたが途中で力尽きています.ご了承ください.
関数の定義より先に,その関数を呼び出すコードを記述することができる
以下のコードはエラーなく動作します.
<?php
func();
function func() {
echo 'OK';
}
関数1の内部で定義した関数2は,関数1を呼び出した後でないと実行できない
以下コードはエラーなく動作します.
<?php
func1();
function func1() {
echo 'func1';
function func2() {
echo 'func2';
}
}
しかし,以下は動作しません.
<?php
func2();
function func1() {
echo 'func1';
function func2() {
echo 'func2';
}
}
以下のように,func1()
のあとにfunc2()
を呼び出すようにするとエラーなく動作しますが,
<?php
func1();
func2();
function func1() {
echo 'func1';
function func2() {
echo 'func2';
}
}
この順番を逆にすると動作しません.
<?php
余談ですが,関数の内部だけでなく,if
文の内部で宣言された関数も同様の挙動になるみたいです.
定義前に呼び出そうとするとエラーが出ます.
<?php
func1();
if (true) {
function func1() {
echo 'func1';
}
}
定義後であれば大丈夫です.
<?php
if (true) {
function func1() {
echo 'func1';
}
}
func1();
定義後であっても,if
式の評価の結果関数定義部分が実行されないと同様に呼び出すことはできません.
以下のコードはエラーが発生します.
<?php
if (false) {
function func1() {
echo 'func1';
}
}
func1();
マニュアルでは以下の部分で記載されています.
PHP では、関数は参照される前に定義されている必要はありません。 ただし以下の二つの例のように、条件付きで関数が 定義されるような場合を除きます。
https://www.php.net/manual/ja/functions.user-defined.php
PHPはインタプリタ言語
注意:この先,筆者が力尽きていますのでしっかりとした結論が出ていません
ん?
ここでちょっと思いました.どうも,PHPインタプリタくんはファイルを実行した際,function
から始まる行について先に読み込んで,なにか処理をしているようです.
インタプリタ言語って上から一行ずつ読み込んでコンパイルして逐次実行していくイメージです.どういう順序で処理してるんでしょうか.
この疑問については別記事に分割しました.ただ,根拠のある結論は出ていませんので,ご了承ください.