PHPではマジック定数を使うことでソースファイルについてのメタ情報を調べることができます。
メタ情報というのは例えばファイル名・ディレクトリ名とか関数名とかクラス名のこと
例えば __FILE__ とか __DIR__ とかは有名ですが、実はマジック定数は8つも定義されてます。
ということでそのマジック定数の意味やコード例をまとめて紹介
このページの目次
PHPのマジック定数一覧
現在PHPで使える__XXX__形式のマジック定数は次の8種類
- __FILE__
- __DIR__
- __LINE__
- __FUNCTION__
- __METHOD__
- __CLASS__
- __TRAIT_
- __NAMESPACE__
これらについて順に使い方とかを紹介していきます。
__FILE__
この定数が呼び出されたファイルのフルパス+ファイル名を返す。
インクルードされたファイル内で呼び出した場合、呼び出し元でなくそのファイルのフルパス
次は hoge.php というファイルで __FILE__ を表示しているコード例
1 2 3 4 5 6 |
<?php print_r( __FILE__ ); /// => C:/xampp/htdocs/hoge.php ?> |
このコードのように C:/xampp/htdocs/hoge.php みたいなフルパスを返してきます。
ちなみに次はインクルードしたファイルで __FILE__ を表示する例
例 : hoge.phpでpiyo.phpをインクルードし、piyo.phpで __FILE__ を表示する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/** hoge.phpの内容 */ <?php include "piyo.php"; ?> /** piyo.phpの内容 */ <?php print_r( __FILE__ ); /// => C:/xampp/htdocs/piyo.php ?> |
この例のようにインクルードされたファイル内では呼び出し元ではなく、自分自身のPHPファイルのフルパスを返すことに注意
__DIR__
この定数が呼び出されたファイルがあるディレクトリのフルパスを返す
ディレクトリパスの最後に区切り文字(スラッシュなど)はつかない
次は hoge.php というファイル内で自身のファイルがあるディレクトリ名を表示するコード例
1 2 3 4 5 6 |
<?php print_r( __DIR__ ); /// => C:/xampp/htdocs ?> |
上のコード例のように C:/xampp/htdocs などのルートディレクトリからのフルパスが表示されます。
ただし __FILE__ と同じくインクルードされたファイルから呼び出した場合、そのファイルがあるディレクトリのフルパスになる点に注意です。
__LINE__
この定数が呼び出されたソースファイル上の現在の番号を返す
例えば次がソースコード内で行番号を表示するコード例
1 2 3 4 5 6 |
<?php print_r( __LINE__ . '行目' ); /// => 4行目 ?> |
__LINE__ は1から始まる行番号を数字として返すだけです。
print_r でのデバッグ時に __FILE__ と一緒に使うとファイル名と行番号を表示できて便利です。
__FUNCTION__
この定数が呼び出された場所にある純粋な関数名を返す。
もしなければ空の文字列
例えば次はグローバル関数とクラス内関数のそれぞれで __FUNCTION__ を表示しているコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/** 普通の関数で __FUNCTION__ 表示 */ function hoge_func(){ print_r( __FUNCTION__ ); /// => hoge_func } hoge_func(); /** クラス関数で __FUNCTION__ 表示 */ class Hoge{ public static function hoge_func(){ print_r( __FUNCTION__ ); /// => hoge_func } } Hoge::hoge_func(); |
上のコード例だとどちらも hoge_func と表示されます。
グローバル関数でもクラス内関数でも純粋な関数名だけを返すのが特徴です。
次に紹介する __METHOD__ と違い、クラス名などは一切付きません。
__METHOD__
この定数が呼び出された場所にある関数の名前を返す
__FUNCTION__ と違うのはクラス名などを含む厳密な名前であること
例えば次がグローバル関数とクラス内関数を __METHOD__ で表示しているコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/** 普通の関数で __FUNCTION__ 表示 */ function hoge_func(){ print_r( __METHOD__ ); /// => hoge_func } hoge_func(); /** クラス関数で __FUNCTION__ 表示 */ class Hoge{ public static function hoge_func(){ print_r( __METHOD__ ); /// => Hoge::hoge_func } } Hoge::hoge_func(); |
グローバルな関数の場合は普通に hoge_func と関数名だけが返ってきます。
しかしクラス内関数だと Hoge::hoge_func のようにクラス名がつくのが __FUNCTION__ との違いですね。
ちなみに名前空間内にある場合はその名前空間名も付与されて表示されます。
__CLASS__
この定数が呼び出された場所にあるクラス名を返す。
もしクラス内でなければ空の文字列
次はHogeクラス内の関数で __CLASS__ を表示しているコード例
1 2 3 4 5 6 7 |
class Hoge{ public static function hoge_func(){ print_r( __CLASS__ ); /// => Hoge } } Hoge::hoge_func(); |
上のコードだと Hoge と表示されます。
__TRAIT__
この定数が呼び出された場所にあるトレイトの名前を表示する。
もしトレイト内でないならば空の文字列
ちなみにトレイトは関数をまとめるためのもので、他言語のインターフェースみたいなもの
例えば次はAnyFuncトレイト内の関数で __TRAIT__ を表示しているコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/** 1つの関数を持つトレイト */ trait AnyFunc { function any_func() { print_r( __TRAIT__ ); /// => AnyFunc } } /** クラスに AnyFunc を実装 */ class Hoge{ use AnyFunc; } $hoge = new Hoge(); $hoge->any_func(); |
上のコードだと AnyFunc が表示されます。
ちなみにトレイトの使用方法などついては次のPHPマニュアルを参照
PHP5.4.0以降から使えるようになった機能です。
__NAMESPACE__
この定数が呼び出された場所での名前空間の名前を返す
もし名前空間内でないなら空の文字列
例えば次が Foo\Bar という名前空間で __NAMESPACE__ を表示しているコード例
1 2 3 4 5 6 7 8 |
/** Foo\Bar という名前空間 */ namespace Foo\Bar{ function func(){ print_r( __NAMESPACE__ ); /// => Foo\Bar } func(); } |
上のコードだと Foo\Bar と名前空間がそのまま表示されます。
ちなみに名前空間の詳しい解説については次のPHPマニュアルを参照
名前空間はPHPバージョン5.3.0以降で使用可能です。
ここまでのまとめ
それぞれのマジック定数が返す値についてもう一度まとめると次の通り
- __FILE__
この定数を呼び出したファイルのフルパス
- __DIR__
この定数が呼び出したファイルのあるディレクトリのフルパス
- __LINE__
この定数を呼び出した地点でのファイルの行番号
- __FUNCTION__
関数内でこの定数を呼び出した場合、その関数の純粋な名前
- __METHOD__
関数内でこの定数が呼び出した場合、クラス名などを含む関数の厳密な名前
- __CLASS__
クラス内でこの定数を呼び出した場合、そのクラス名
- __TRAIT__
トレイト内でこの定数を呼び出した場合、そのトレイト名
- __NAMESPACE__
名前空間内でこの定数を呼び出した場合、その名前空間の名前
改めてまとめてみると色んなマジック定数があることが分かりますね。
デバッグ時とか動的に関数やクラスを生成する場合とかに便利そうです。
以上PHPで定義済みのマジック定数についてまとめてみました。
ではでは・△・)ノ バイバイ