PHP - NameSpace命名空間 - 筆記長也NotesHazuya

PHP - NameSpace命名空間

2018-05-19 14:38:12   PHP

上一回提到命名空間是在"C#的命名空間與Java的套件包"一文當中,比較了Java的Package以及C#的namespace,本次要提到的是PHP當中的namespace,與C#當中的namespace是差不多的,都是一種虛擬的結構,而非系統實體檔案的位置與結構,本文將介紹如何使用PHP的命名空間。

宣告

宣告的方法與C#相同,但請注意必須直接在PHP的開頭就宣告,不能在宣告前加入任何的東西(包含HTML程式碼等)。

namespace my;
class test{
	private $test1;
    function __construct($test1){
		$this->test1=$test1;
        echo "TEST OK!";
    }
	
	function getTest(){
		echo $this->test1;
	}
}

上方宣告了一個名為my的命名空間,含有test類別。

echo "HAHAHA~"
namespace my;

如果宣告命名空間前有任何其他的語法,包含PHP標籤外的HTML等,都會造成程式錯誤。

namespace my{
  //程式區塊
}
namespace my2{
  //程式區塊
}

也可以用{}大括弧括住命名空間,也可在同一個PHP文件中宣告多的命名空間,但是不希望大家這麼做,可能會造成混淆。

另外,同一個命名空間不需要宣告在同一個PHP文件當中,可以屬於不同的PHP文件。

匯入與別名

PHP5.3前可以匯入空間並別名,PHP5.6後可以匯入空間當中的函數。

請注意,即便宣告了命名空間也要以require或include來告訴程式需要使用的其他文件,否則程式無法執行。現在的程式通常會以autoload的方法自動載入所需的文件。

直接匯入

require ("test2.php");
$test2=new \my\test2();
$test2->testf();

這種方法不使用別名,直接匯入並建立物件。

Use關鍵字 - 預設別名

require ("test.php");
use my\test;
$test=new test(50);
$test->getTest();

預設別名將直接使用該命名空間中的類別名稱。

Use關鍵字 - 自訂別名

require ("test.php");
use my\test as u;
$test3=new u(100);

以 as 來將引入空間中的類別自訂為u。

多重匯入

如果要匯入多個空間中的類別等,PHP可以只使用一個use關鍵字就能匯入。

use my\test,
    my\test2;

但是我想這樣不好閱讀,下面的方法我覺得更整齊

use my\test;
use my\test2;

運作方法

從上面的匯入範例來看,PHP將命名空間轉為類別的名稱,例如在my命名空間下的類別test,該類別的完整名稱就為my\test。

全域命名空間

若沒有使用命名空間的情況下存取類別,PHP會假設這個類別屬於一命名空間,如果不是,就會直接解析這個類別。但如果要在一個命名空間中使用其他空間的類別,必須告訴PHP完整的類別名稱(命名空間 + 類別名稱)。

但是可能某些方法或類別並不存在於任何命名空間當中,例如內建的Exception。

namespace my;
class test2{
	function testf(){
		throw new Exception();
	}
}

當在命名空間my要使用其他空間的類別時,如果直接輸入該類別名稱,PHP會從這個命名空間向下尋找子空間,因此會變成my\Exception。

如果要正常使用,則需要這樣,其實這和存取檔案的路徑很相似。

namespace my;
class test2{
	function testf(){
		throw new \Exception();
	}
}

範例檔案

原本都將範例丟在學校主機,可惜學校主機PHP版本太舊,只好丟在GIIHUB上了,有需要可以用:https://github.com/nnwa1689/PHP_NameSpace

關於作者


長也

資管菸酒生,嘗試成為網頁全端工程師(laravel / React),技能樹成長中,閒暇之餘就寫一些筆記。 喔對了,也愛追一些劇,例如火神跟遺物整理師,推推。最愛的樂團應該是告五人吧(?)