1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-10-17

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

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

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

<?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から始まる行について先に読み込んで,なにか処理をしているようです.

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

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

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?