PHPの関数の登録の記事で

<?php

$funcs = get_defined_functions();
var_dump($funcs);

$a = myFunc();

function myFunc(){
	return null;
}

このようにmyFunc関数の記述の前に、get_defined_functions関数を実行したらどうなるのか?を試してみたら、エラーなく実行された内容を記載した。


この試みの後、2つほど疑問が生じた。

・includeの時はどうなるのか?

・条件分岐内に関数の定義を記載し、その定義を通過しなかった場合はどうなるか?

の上記の二点で、どちらもPHP製のWebアプリケーションを開発する上でパフォーマンスの向上として頻繁に用いている。

パフォーマンスの向上として頑張ってコードを書いているけれども、実は意味がなかったという事がありそうなのでこの機会に試してみる。

※この手の話はC言語で書かれたPHPのソースコードを読めば一発解決だけれども、一応念の為

php/php-src: The PHP Interpreter - GitHub




最初は一般的な書き方で試す。

dir
├── func.php
└── main.php

func.php

<?php
function myFunc(){
	return null;
}

main.php

<?php
include("./func.php");

$funcs = get_defined_functions();
var_dump($funcs);

上記の結果は前回と同じなので省略する。




次にmain.phpの方を書き換えて確認してみる。

main.php

<?php
$funcs = get_defined_functions();
var_dump($funcs);

include("./func.php");

PHPがマルチパス方式でファイルを読み込んでいるとして、上のコードであれば、includeで読み込んだファイルも事前に読み込んでいるか?を確認できる。

結果は、

$ php /path/to/dir/main.php
array(2) {
  'internal' =>
  array(1617) {
    [0] =>
    string(12) "zend_version"
    [1] =>
    string(13) "func_num_args"
    [2] =>
    string(12) "func_get_arg"
    [3] =>
    string(13) "func_get_args"
    [4] =>
    string(6) "strlen"
    [5] =>
    string(6) "strcmp"
    
    (more elements)...
  }
  'user' =>
  array(0) {
  }
}

※internalの方の関数の6番目以降は省略


ユーザー定義関数の登録数が0となっていた。

これでPHPがファイルを読み込む時はincludeで読み込むファイルまではいっぺんに読み込まないことがわかった。




続いて、下記のコードを試してみる。

func.php

&lt:?php
if(false){	//myFunc関数は絶対に読み込まない
	function myFunc(){
		return null;
	}
}

$funcs = get_defined_functions();
var_dump($funcs);

myFunc関数の記述はあるけれども、myFunc関数の箇所は絶対に読み込まれないようにしたらどうなるか?


結果は

$ php /path/to/dir/func.php
array(2) {
  'internal' =>
  array(1617) {
    [0] =>
    string(12) "zend_version"
    [1] =>
    string(13) "func_num_args"
    [2] =>
    string(12) "func_get_arg"
    [3] =>
    string(13) "func_get_args"
    [4] =>
    string(6) "strlen"
    [5] =>
    string(6) "strcmp"
    
    (more elements)...
  }
  'user' =>
  array(0) {
  }
}

※internalの方の関数の6番目以降は省略


ユーザー定義関数の登録数が0となっていた。

これで関数の定義の記述は実行時に必ず通過しなければ関数は登録されないということがわかった。


これらの内容を踏まえた上で、これからPHPはどのように関数を登録するか?を見ていきたい。