(PHP) 全マジック定数の使い方一覧【__FILE__や__DIR__など】

(PHP) 全マジック定数の 使い方一覧 【__FILE__や__DIR__など】

 

本記事では、PHPで使用できる
全マジック定数について、使い方を解説していく。

 

PHPのマジック定数とは

PHPのマジック定数とは、
ソースファイルについてのメタ情報があらかじめ格納された定数のことだ。

マジック定数に格納されている値は、プログラム上のどこからでも参照できる。

<?php

print_r( __FILE__ );


実行結果
C:/xampp/htdocs/test.php

 

__FILE__、__DIR__などは比較的よく見かけるマジック定数なのではないかと思う。

 

メタ情報とは

メタ情報とは、例えばファイル名やディレクトリ名、クラス名など、
マジック定数が記載されている箇所での様々な情報のことだ。

PHPではこのマジック定数を使うことでソースファイルについてのメタ情報を簡単に調べることが可能なので、マジック定数はぜひ積極的に活用していった方が良い。

マジック定数は8つ定義されている。

 

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 が表示される。

 

■トレイト

https://www.php.net/manual/ja/language.oop5.traits.php

 

 

__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__
名前空間内でこの定数を呼び出した場合、その名前空間の名前

 

関連記事

(PHP) 可変関数とは?【使い方・メリットなど】
(PHP) GETとPOSTの違い【適切な使い分け方も解説】
(PHP) コールバック関数とは?使い方を分かりやすく解説

 

https://www.php.net/manual/ja/language.constants.magic.php

 

記事が気に入った方はシェアをお願いします!

コメントを残す

メールアドレスが公開されることはありません。