【PHP】クラス名や名前空間の先頭・冒頭につけるバックスラッシュ \の意味は何か?「\クラス名::」や「\名前空間\クラス名::」の処理をわかりやすく解説

programming-with-three-displays-bg-binary PHP
記事内に広告が含まれていることがあります。

PHPや、そのフレームワークであるLaravelなどを使っていると、クラス名や名前空間の先頭・冒頭につけるバックスラッシュ 「\」がついた記述を目にすることがあります。

同じ処理でもバックスラッシュ 「\」がついている時と、ついていない時があったりまします。

もちろん、このバックスラッシュ 「\」にはきちんと意味があります。その意味と使い方を実例を用いてわかりやすく解説します。

クラス名や名前空間の先頭・冒頭につけるバックスラッシュ \の意味は何か?

結論から言うと、グローバル空間であることを示す記述になります。

つまり、\クラス名 や \名前空間\クラス名 と記述することで、どこに記述しても常に指定した同じクラスを呼び出せるようになります。

いきなり、「グローバル空間」や「名前空間」と言う専門用語が出てきましたが、どちらも難しくない概念なので、心配することはありません。

名前空間とは?

名前空間とは、処理を記述している場所に名前をつけることを言います。namespace で指定します。

PHPなど他の主な言語も同じですが、クラス名やメソッド名は重複することができず、1つのプロジェクトの中で、重複して定義するとコンパイル時にエラーになります

しかし、名前空間(namespace)を使うことで、同じ関数名を使うことができます

例えば、以下のようにaaa.phpとbbb.phpの2つのファイルがあるとします。どちらもTestClassと greetingメソッドを定義しています。

しかし、冒頭の名前空間が App\Aaa と App\Bbb で異なるため、エラーにならずに使うことができます。

namespace App\Aaa;

class TestClass{
    public static function greeting(){
        echo "Hello! Aaa";
    }
}

TestClass::greeting();  //出力: Hello! Aaa 
namespace App\Bbb;

class TestClass{
    public static function greeting(){
        echo "Hello! Bbb";
    }
}

TestClass::greeting();  //出力: Hello! Bbb

つまり、「名前をつけて識別できるようにした空間」=「名前空間」です。

それぞれの名前空間の中で、TestClass::greeting を実行すれば、その名前空間の中で定義したメソッドが実行されていることがわかります。

グローバル空間とは?

一方で、グローバル空間とは、名前空間の外のことを指します。

グローバル空間と名前空間のイメージ

名前空間の中で定義したクラスを、グローバル空間の中で呼び出す場合は完全なクラス名を指定する必要があります。

例えば、以下のように App\Aaaという名前空間の中に定義されたTestClassというクラスを、グローバル空間で呼び出したい場合は、 App\Aaa\TestClass とする必要があります。

namespace App\Aaa;

class TestClass{
    public static function greeting(){
        echo "Hello! Aaa";
    }
}

greetingメソッドを呼び出したいときは、App\Aaa\TestClass::greeting() となります。

注意点|名前空間の中で外のクラスを呼び出す場合

名前空間とグローバル空間については理解していただけたと思います。しかし、注意しなければいけない点があります。

それは、名前空間の中で、その外にあるクラスを呼び出すときです。

例えば、以下のように、名前空間 App\Aaa と App\Bbb がある場合です。

ことの時に App\Bbb の中で、App\Aaa のメソッドを呼び出す場合に、先ほどの、グローバル空間のところで説明した、 App\Aaa\TestClass を指定するとエラーになります。

namespace App\Aaa;

class TestClass{
    public static function greeting(){
        echo "Hello! Aaa";
    }
}

TestClass::greeting();  //出力: Hello! Aaa 
namespace App\Bbb;

class TestClass{
    public static function greeting(){
        echo "Hello! Bbb";
    }
}

App\Aaa\TestClass::greeting();  //出力: エラー!!!

エラーの内容を見れば理由はわかるのですが、指定したクラス名が、「App\Bbb\App\Aaa\TestClass」に変換されています。

エラーの例

PHP Fatal error: Uncaught Error: Class “App\Bbb\App\Aaa\TestClass” not found in /workspace/Main.php

これは、App\Bbb の中で、App\Aaa を指定したので、PHPがグローバル空間名は「App\Bbb\App\Aaa\TestClass」だと判定したためです。

先頭・冒頭につけるバックスラッシュ「\」の使い方

ここでいよいよ本題です。このように、名前空間の中で外のクラスを呼び出す場合は、指定した名前が、グローバル空間における名前であることを示す必要があります。

これは、冒頭にバックスラッシュ「\」をつけることで指定できます。

先ほどの例で、クラス名の冒頭に「\」をつけて「\App\Aaa\TestClass::greeting();」とするとエラーが発生することなく処理が実行されます。

namespace App\Bbb;

class TestClass{
    public static function greeting(){
        echo "Hello! Bbb";
    }
}

\App\Aaa\TestClass::greeting();  //出力: Hello! Aaa 

バックスラッシュ「\」がなくても同じ処理になる場合

先ほどは、名前空間の中で他のクラスを呼び出す場合の例でした。

名前空間の外のグローバル空間でクラスを呼び出す場合は、クラス名の冒頭にバックスラッシュ「\」がなくても、先頭に余計な名前がつかず、そのままのクラスとして認識されます。

このため、バックスラッシュ「\」のあり・なしに関わらず、同じ処理が実行されます。

グローバル空間(名前空間がない場所)での処理の実行例

\App\Aaa\TestClass::greeting(); //出力: Hello! Aaa

App\Aaa\TestClass::greeting(); //出力: Hello! Aaa

まとめ

クラス名や名前空間の先頭・冒頭につけるバックスラッシュ「\」は、グローバル空間であることを明示するという役割です。

名前空間の外でクラスを指定する場合は、バックスラッシュ「\」の有無で処理が変わることはなく、同じ結果が返ります。

ですが、バックスラッシュ「\」を記述した方が、誰がみてもどのクラスを参照しているかがわかるようになるので、共同開発のプロジェクトの場合は、バックスラッシュ「\」をつける方がお勧めです。

タイトルとURLをコピーしました