- 2014-06-04 (水) 15:00
- PHP
PHP には、定義されているクラスや関数、変数などの一覧を取得する関数があります。
ここでは定義情報を取得できる関数群をまとめてみました。ここでは実行例として、Laravel アプリケーションのビューテンプレート(hoge.blade.php)で実行した内容を記載しています。
定義された情報を取得する関数群
get_defined_constants()
定義されている定数を連想配列として取得します。キーが定数名で、要素がその値となっています。
http://www.php.net/manual/ja/function.get-defined-constants.php
出力してみると、1771 個の定数がありました。内容を見ると、フレームワークやアプリケーションで定義されたものの他に、PHP本体や extension で多数の定数が定義されていることがわかります。
array (size=1771) 'E_ERROR' => int 1 'E_RECOVERABLE_ERROR' => int 4096 'E_WARNING' => int 2 ...
get_declared_classes()
定義されているのクラスの名前が配列として取得します。
http://www.php.net/manual/ja/function.get-declared-classes.php
304 個のクラスが定義されていました。
array (size=304) 0 => string 'stdClass' (length=8) 1 => string 'Exception' (length=9) 2 => string 'ErrorException' (length=14) 3 => string 'Closure' (length=7) ...
get_declared_interfaces()
定義されているインターフェイスを配列として取得します。
http://www.php.net/manual/ja/function.get-declared-interfaces.php
55 個のインターフェイスが定義されていました。
array (size=55) 0 => string 'Traversable' (length=11) 1 => string 'IteratorAggregate' (length=17) 2 => string 'Iterator' (length=8) 3 => string 'ArrayAccess' (length=11) ...
get_declared_traits()
定義されているトレイトを配列として取得します。
http://www.php.net/manual/ja/function.get-declared-traits.php
トレイトの定義が無かったので、サンプルとして Foo をトレイトとして定義しています。
array (size=1) 0 => string 'Foo' (length=3)
get_defined_functions()
定義されている関数を連想配列として取得します。
http://www.php.net/manual/ja/function.get-defined-functions.php
連想配列には2つのキーがあり、internal
には内部関数、user
にはユーザ定義関数が配列として格納されています。
ここでは、1,686個(!)の内部関数と74個のユーザ定義関数がありました。
array (size=2) 'internal' => array (size=1686) 0 => string 'zend_version' (length=12) 1 => string 'func_num_args' (length=13) 2 => string 'func_get_arg' (length=12) 3 => string 'func_get_args' (length=13) ... 'user' => array (size=74) 0 => string 'composerrequirea978da05ae47fd0758967870dd5a04f2' (length=47) 1 => string 'composerautoloadincludefile' (length=29) 2 => string 'crypt_random_string' (length=19) 3 => string '_swiftmailer_init' (length=17)
get_defined_vars()
全ての定義済の変数を連想配列で取得します。
http://www.php.net/manual/ja/function.get-defined-vars.php
連想配列のキーに変数名、要素が変数値となっています。
array (size=6) '__path' => string '/share/app/config/../views/login.php' (length=36) '__data' => array (size=4) '__env' => object(IlluminateViewEnvironment)[208] protected 'engines' => object(IlluminateViewEnginesEngineResolver)[202] ... protected 'finder' => object(IlluminateViewFileViewFinder)[207] ... ...
get_included_files() / get_required_files()
include または require で読み込まれたファイル名を配列として取得します。
http://www.php.net/manual/ja/function.get-included-files.php
255 個のファイルが読み込まれていました。get_required_files()
は、get_included_files()
のエイリアスとなっているので、実行結果はどちらでも同じです。
array (size=225) 0 => string '/share/public/index.php' (length=23) 1 => string '/share/bootstrap/autoload.php' (length=29) 2 => string '/share/vendor/autoload.php' (length=26) 3 => string '/share/vendor/composer/autoload_real.php' (length=40) ...
get_loaded_extensions()
コンパイル/ロードされているモジュールを配列として取得します。
http://www.php.net/manual/ja/function.get-loaded-extensions.php
58 個のモジュールが有効になっていました。
array (size=58) 0 => string 'Core' (length=4) 1 => string 'date' (length=4) 2 => string 'ereg' (length=4) 3 => string 'libxml' (length=6)
なお、get_loaded_extensions()
では、引数に真偽値を指定することができ、true
を渡すと、Zend 拡張モジュールのみを取得します。
実行してみると、下記の 2 つだけでした。
array (size=2) 0 => string 'Zend OPcache' (length=12) 1 => string 'Xdebug' (length=6)
ini_get_all()
設定値を連想配列として取得します。
http://www.php.net/manual/ja/function.ini-get-all.php
下記エントリで実行結果を記載していますので、ご参考まで。
http://qiita.com/shin1x1/items/f469bfb73c396007f911
使いどころ
色々と使いどころはあるのですが、便利な使い方を一つ。
フレームワークのビューテンプレートで、定義(バインド)されている変数をリストアップします。CakePHPやLaravelなどのフレームワークでは、ビューテンプレートをビュークラスのメソッドで読み込んで実行するので、ビューテンプレート内はこのメソッドのコンテキストで実行されることになります。
get_defined_vars()
を使うことで、実際にはどのような変数がビューテンプレートで定義されているかを確認できます。
下記が、Laravel ビューテンプレートでget_defined_vars()
を実行した例です。このビューテンプレートでは 6 つの変数が定義されており、$__path
、$__data
、$__env
、$app
、$errors
、$loginUser
として利用できることが分かります。
このように、マニュアルなどのドキュメントを見ずとも、コードで利用できる変数を知ることができます。
<?php var_dump(array_keys(get_defined_vars())) ?> array (size=6) 0 => string '__path' (length=6) 1 => string '__data' (length=6) 2 => string '__env' (length=5) 3 => string 'app' (length=3) 4 => string 'errors' (length=6) 5 => string 'loginUser' (length=9)
他には、クロージャ内でget_defined_vars()
を実行して、スコープにある変数がどれかを確認したり、PHPの挙動を知るのにも使えます。
さいごに
こういった定義を確認する関数群は日々使うというわけではありません。ただ、知っておくと、アプリケーションのデバッグや、フレームワークの挙動を確認したりする際に役立ちます。
日々開発しているPHPコードの定義情報を見てみると、新たな発見があるかもしれませんよ。
このエントリで紹介した関数群を書いたコード Gist に置いてます。参考まで。
追記
@shin1x1 コマンドラインですけどextension向けならphp –ri memcachedとかphp –rc memcachedとかよく使います。
— withgod (@withgod) June 4, 2014
このエントリでは、配列で取得する関数を取り上げましたが、コマンドラインでも取得できます。extension で定義されているクラスや設定を見るなら、コマンドの方が手軽ですね。
$ php -h ... --rfShow information about function . --rc Show information about class . --re Show information about extension . --rz Show information about Zend extension . --ri Show configuration for extension .