Help us understand the problem. What is going on with this article?

PHPの関数は使用前に定義しなくても呼び出せる

有名な話だと思いますが,自分用まとめです.途中で気になって内部仕様について深堀りもしましたが途中で力尽きています.ご了承ください.

関数の定義より先に,その関数を呼び出すコードを記述することができる

以下のコードはエラーなく動作します.

<?php

 func();

 function func() {
     echo 'OK';
 }

https://3v4l.org/XWgHF

関数1の内部で定義した関数2は,関数1を呼び出した後でないと実行できない

以下コードはエラーなく動作します.

<?php

 func1();

 function func1() {
     echo 'func1';
     function func2() {
         echo 'func2';
     }
 }

https://3v4l.org/kiG23

しかし,以下は動作しません.

<?php

 func2();

 function func1() {
     echo 'func1';
     function func2() {
         echo 'func2';
     }
 }

https://3v4l.org/66faT

以下のように,func1() のあとにfunc2() を呼び出すようにするとエラーなく動作しますが,

<?php

 func1();
 func2();

 function func1() {
     echo 'func1';
     function func2() {
         echo 'func2';
     }
 }

https://3v4l.org/vPKBS

この順番を逆にすると動作しません.

<?php


https://3v4l.org/bpXPp

余談ですが,関数の内部だけでなく,if 文の内部で宣言された関数も同様の挙動になるみたいです.
定義前に呼び出そうとするとエラーが出ます.

<?php

 func1();

 if (true) {
    function func1() {
        echo 'func1';
    }
 }

定義後であれば大丈夫です.

<?php

if (true) {
   function func1() {
       echo 'func1';
   }
}

func1();

https://3v4l.org/c1KN9

定義後であっても,if 式の評価の結果関数定義部分が実行されないと同様に呼び出すことはできません.
以下のコードはエラーが発生します.

<?php

if (false) {
   function func1() {
       echo 'func1';
   }
}

func1();

https://3v4l.org/5MmRM

マニュアルでは以下の部分で記載されています.

PHP では、関数は参照される前に定義されている必要はありません。 ただし以下の二つの例のように、条件付きで関数が 定義されるような場合を除きます。
https://www.php.net/manual/ja/functions.user-defined.php

PHPはインタプリタ言語

注意:この先,筆者が力尽きていますのでしっかりとした結論が出ていません

ん?

ここでちょっと思いました.どうも,PHPインタプリタくんはファイルを実行した際,functionから始まる行について先に読み込んで,なにか処理をしているようです.

インタプリタ言語って上から一行ずつ読み込んでコンパイルして逐次実行していくイメージです.どういう順序で処理してるんでしょうか.

この疑問については別記事に分割しました.ただ,根拠のある結論は出ていませんので,ご了承ください.

PHPの関数が定義前に呼び出せるのはなぜか

x-trans
AWS、GCP、Azureの導入設計、環境構築、運用・保守までサポートするエンジニア軍団
https://x-trans.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away