本記事では、PHPで使用できる
全マジック定数について、使い方を解説していく。
PHPのマジック定数とは
PHPのマジック定数とは、
ソースファイルについてのメタ情報があらかじめ格納された定数のことだ。
マジック定数に格納されている値は、プログラム上のどこからでも参照できる。
<?php
print_r( __FILE__ );
実行結果
C:/xampp/htdocs/test.php
__FILE__、__DIR__などは比較的よく見かけるマジック定数なのではないかと思う。
PHPのマジック定数一覧
ではここから本題。
PHPで使えるマジック定数は次の8種類だ。
- __FILE__
- __DIR__
- __LINE__
- __FUNCTION__
- __METHOD__
- __CLASS__
- __TRAIT_
- __NAMESPACE__
上記マジック定数について、順に使い方を紹介していく。
__FILE__
プログラム上で__FILE__と記載すると、
定数が呼び出されたファイルのフルパス+ファイル名を返す。
次は test.php というファイルで __FILE__ を表示しているコード例
<?php
print_r( __FILE__ );
実行結果(例)
C:/xampp/htdocs/test.php
上記のように C:/xampp/htdocs/test.php と言うフルパスを返してくる。
例 : test.phpでsample.phpをインクルードし、smple.phpで __FILE__ を表示する
/** sample.php */
<?php
print_r( __FILE__ );
/** test.php */
<?php
include "sample.php";
実行結果
C:/xampp/htdocs/sample.php
上記のように、
インクルードされたファイル内だとしても、呼び出し元ではなく、自分自身のPHPファイルのフルパスを返すことに注意が必要だ。
__DIR__
プログラム上で__DIR__と記載すると、
定数が呼び出されたファイルがあるディレクトリのフルパスを返す。
ディレクトリパスの最後に区切り文字(スラッシュなど)はつかない。
次は test.php というファイル内で自身のファイルがあるディレクトリ名を表示するコード例
<?php
print_r( __DIR__ );
実行結果
C:/xampp/htdocs
上のコード例のように C:/xampp/htdocs などのルートディレクトリからのフルパスが表示される。
ただし __FILE__ と同じくインクルードされたファイルから呼び出した場合でも、そのファイルがあるディレクトリのフルパスを返す点に注意が必要だ。
__LINE__
プログラム上で__LINE__と記載すると、
定数が呼び出されたソースファイル上の現在の番号を返す。
例えば次がソースコード内で行番号を表示するコード例
<?php
print_r( __LINE__ . '行目' );
実行結果
3行目
__LINE__ は1から始まる行番号を数字として返す。
デバッグ時やログへの出力の際に、
__FILE__ と一緒に使うとファイル名と行番号を表示できて便利だ。
__FUNCTION__
プログラム上で__FUNCTION__と記載すると、
定数が呼び出された場所にある純粋な関数名を返す。
もしなければ空の文字列を返す。
例えば次はグローバル関数とクラス内関数のそれぞれで __FUNCTION__ を表示しているコード
/** 普通の関数で __FUNCTION__ 表示 */
function test_func(){
print_r( __FUNCTION__ );
}
test_func();
実行結果
test_func
/** クラス関数で __FUNCTION__ 表示 */
class Test{
public static function test_func(){
print_r( __FUNCTION__ );
}
}
Test::test_func();
実行結果
test_func
上のコード例だと、
どちらも test_func と表示されます。
グローバル関数でもクラス内関数でも純粋な関数名だけを返すのが特徴だ。
__METHOD__
プログラム上で__METHOD__と記載すると、
定数が呼び出された場所にある関数の名前を返す。
__FUNCTION__ と一見すると似ているが、
__FUNCTION__ と違うのはクラス名などを含む厳密な名前を返す点だ。
例えば次がグローバル関数とクラス内関数を __METHOD__ で表示しているコード
/** 普通の関数で __FUNCTION__ 表示 */
function test_func(){
print_r( __METHOD__ );
}
test_func();
実行結果
test_func
/** クラス関数で __FUNCTION__ 表示 */
class Test{
public static function test_func(){
print_r( __METHOD__ );
}
}
Test::test_func();
実行結果
Test::test_func
グローバルな関数の場合は普通に test_func と関数名だけが返ってきている。
しかしクラス内関数だと Test::test_func のように、
クラス名がついてきているのが分かる。これが __FUNCTION__ との違いだ。
ちなみに名前空間内にある場合はその名前空間名も付与されて表示される。
__CLASS__
プログラム上で__CLASS__と記載すると、
定数が呼び出された場所にあるクラス名を返す。
もしクラス内でなければ空の文字列を返す。
次はTestクラス内の関数で __CLASS__ を表示しているコード例
class Test{
public static function test_func(){
print_r( __CLASS__ );
}
}
Test::test_func();
実行結果
Test
上のコードだと、クラス名の Test が表示される。
__TRAIT__
プログラム上で__TRAIT__と記載すると、
定数が呼び出された場所にあるトレイトの名前を表示する。
もしトレイト内でないならば空の文字列を返す。
ちなみにトレイトは関数をまとめるためのもので、他言語のインターフェースみたいなもの
例えば次はAnyFuncトレイト内の関数で __TRAIT__ を表示しているコード
/** 1つの関数を持つトレイト */
trait ExFunc {
function ex_func() {
print_r( __TRAIT__ );
}
}
/** クラスに AnyFunc を実装 */
class Test{
use ExFunc;
}
$hoge = new Test();
$hoge->ex_func();
実行結果
ExFunc
上のコードだと ExFunc が表示される。
■トレイト
__NAMESPACE__
プログラム上で__NAMESPACE__と記載すると、
定数が呼び出された場所での名前空間の名前を返す。
もし名前空間内でないなら空の文字列を返す。
例えば次が Foo\Bar という名前空間で __NAMESPACE__ を表示しているコード例
/** Foo\Bar という名前空間 */
namespace Foo\Bar{
function func(){
print_r( __NAMESPACE__ );
}
func();
実行結果
Foo\Bar
上のコードだと Foo\Bar と名前空間がそのまま表示される。
■名前空間とは
https://www.php.net/manual/ja/language.namespaces.rationale.php
PHPのマジック定数の使い方まとめ
最後に、
それぞれのマジック定数が返す値についてもう一度まとめると次の通り
__FILE__
この定数を呼び出したファイルのフルパス
__DIR__
この定数が呼び出したファイルのあるディレクトリのフルパス
__LINE__
この定数を呼び出した地点でのファイルの行番号
__FUNCTION__
関数内でこの定数を呼び出した場合、その関数の純粋な名前
__METHOD__
関数内でこの定数が呼び出した場合、クラス名などを含む関数の厳密な名前
__CLASS__
クラス内でこの定数を呼び出した場合、そのクラス名
__TRAIT__
トレイト内でこの定数を呼び出した場合、そのトレイト名
__NAMESPACE__
名前空間内でこの定数を呼び出した場合、その名前空間の名前
関連記事
https://www.php.net/manual/ja/language.constants.magic.php
メタ情報とは、例えばファイル名やディレクトリ名、クラス名など、
マジック定数が記載されている箇所での様々な情報のことだ。
PHPではこのマジック定数を使うことでソースファイルについてのメタ情報を簡単に調べることが可能なので、マジック定数はぜひ積極的に活用していった方が良い。
マジック定数は8つ定義されている。