【これだけ】PHPの名前空間【現役エンジニアが解説】

PROGRAM

今回は、PHPの名前空間について、名前空間の定義の方法と使い方に分け、簡単に解説していきます。

名前空間の定義の方法

名前空間はクラスや変数、関数等のコードを名前を付けて一つにまとめることができます。

名前空間はクラスと同じように、クラスより一つ上の階層で”namespace 名前空間名{}”で定義することができます。

namespace japan {

    class Language {
        public $region = "";
        
        function __construct($region) {
        	$this->region = $region;
        }
        function __destruct() {
        	
        }
        public function Hello() {
            echo "こんにちは(".$this->region.")";
        }
    
    }

}

上記のコードでは、$regionというプロパティやHelloというメソッドを持つLanguageクラスを包括するjapanという名前の名前空間を作っています。

名前空間の使い方

名前空間を定義したら、その外側からは”名前空間名\クラス名や変数名、関数名”で呼び出すことが可能です。

namespace {
    $JapanLanguage = new japan\Language("東京");
    echo $JapanLanguage->region;
    echo $JapanLanguage->Hello();
}

同一ファイル内に定義されている名前空間を呼び出す場合には、自分自身も名前空間内にいないといけないため、上記のコードでは、”namespace {}”というグローバル名前空間を作り、その中で呼び出しています。

namespace {
    use japan\Language;
    $Language = new Language("東京");
    echo $Language->region;
    echo $Language->Hello();
}

名前空間を呼び出す方法は、”名前空間名\クラス名や変数名、関数名”だけでなく、上記のコードのように、”use 名前空間名 (as 略称)”や”use 名前空間名\クラス名 (as 略称)”もコードを見やすくするために、よく使われています。

名前空間の利点

名前空間の利点は基本的には以下のようなクラス名等の重複を避けることができる点にあります。

// 日本語の言語クラス
class Language {
    public $region = "";
    
    function __construct($region) {
    	$this->region = $region;
    }
    function __destruct() {
    	
    }
    public function Hello() {
        echo "こんにちは(".$this->region.")";
    }

}

// 英語の言語クラス
class Language {
    public $region = "";
    
    function __construct($region) {
    	$this->region = $region;
    }
    function __destruct() {
    	
    }
    public function Hello() {
        echo "Hello(".$this->region.")";
    }

}

上記のLanguageクラスの名前が衝突している問題は、下記のコードのように名前空間を目的別に分けることで解決されます。

namespace japan {

    class Language {
        public $region = "";
        
        function __construct($region) {
        	$this->region = $region;
        }
        function __destruct() {
        	
        }
        public function Hello() {
            echo "こんにちは(".$this->region.")";
        }
    
    }

}

namespace america {

    class Language {
        public $region = "";
        
        function __construct($region) {
        	$this->region = $region;
        }
        function __destruct() {
        	
        }
        public function Hello() {
            echo "こんにちは(".$this->region.")";
        }
    
    }

}

上記で定義したjapanという名前空間のLanguageクラスとamericaという名前空間のLanguageクラスは、下記のコードのように使い分けることができます。

namespace {
    use japan\Language as JapanLanguage;
    $JapanLanguage = new Language("東京");
    echo $JapanLanguage->region;
    echo $JapanLanguage->Hello();

    use america\Language as AmericaLanguage;
    $AmericaLanguage = new Language("NewYork");
    echo $AmericaLanguage->region;
    echo $AmericaLanguage->Hello();
}