命名空間 (名稱空間) 是現代 PHP (Modern PHP) 中的一個非常重要的特性. 命名空間的概念在 PHP 5.3 時引入, 使 PHP 有了如今的發展
現代的 PHP 組件與框架各放置在自己的命名空間中, 以防命名衝突
首先我們對命名空間的名稱進行剖析 :
namespace Jonny\Blog\Plugin\Comment;
這種結構有點類似於操作系統中的檔案夾路徑. 一般, 我們習慣於將第一個命名為廠商、項目所有者或者項目的名稱. 例如上述命名空間宣告, 首先宣告了 Jonny
這個最頂層命名空間, 之後所有的命名空間都屬於 Jonny
的子命名空間. 類推的, Plugin
是 Blog
的子命名空間, Comment
是 Plugin
的子命名空間
假設我現在需要建立一個 PHP 項目 (namespace Jonny
), 它是一個博客項目 (namespace Jonny\Blog
), 包括了 :
- 文章模塊 :
namespace Jonny\Blog\Article
- 評論模塊 :
namespace Jonny\Blog\Comment
- 搜尋模塊 :
namespace Jonny\Blog\Search
- 媒體模塊 :
namespace Jonny\Blog\Media
- 外掛模塊 :
namespace Jonny\Blog\Plugin
- 外觀模塊 :
namespace Jonny\Blog\Theme
- 工具模塊 :
namespace Jonny\Blog\Tool
上面這個實例是否讓你熟悉了命名空間的名稱, 並且對於命名空間的宣告有一定的了解
1. 命名空間的宣告
PHP 中採用 namespace
對命名空間進行宣告, 使用 "\
" 分隔符隔離命名空間與子命名空間
namespace NameOfNameSpace;
如果用上述的宣告方式, 那麼接下來的名稱都將屬於這個命名空間
同時也可以使用 :
namespace NameOfNameSpace {
NAME_SPACE
}
進行宣告
但是, 命名空間的宣告建議遵守一個文件一個命名空間的習慣, 不建議同一個文件中出現多個命名空間
2. 命名空間的使用
PHP 使用 use
關鍵字來導入命名空間
假設現在有命名空間 : namespace Jonny\Blog;
若要使用命名空間 Jonny\Blog
, 那麼可以 :
use Jonny\Blog;
命名空間中的變數和常數可以直接使用了, 但是函式、類別和介面等都是無法使用的, 如果需要使用, 則可以 :
Debug.php
:
<?php
namespace Jonny\Debug;
$a = 0;
define("CON", 10);
function get() {
return 1;
}
class Foo {
public $var;
protected $var2;
private $var3;
public function func($var, $var2, $var3) {
$this->var = $var;
$this->var2 = $var2;
$this->var3 = $var3;
}
public function call() {
echo $this->var." ".$this->var2." ".$this->var3;
}
}
Test.php
:
<?php
require_once "Debug.php";
use Jonny\Blog;
echo $a;
echo "<br />";
echo CON;
echo "<br />";
此時, 瀏覽器界面會顯示 :

當我們呼叫 get()
函式或者 Foo
類別時, 會報錯
<?php
require_once "Debug.php";
use Jonny\Blog;
echo $a;
echo "<br />";
echo CON;
echo "<br />";
echo get();
$obj = new Foo();
$obj->func(1, 2, 3);
$obj->call();

修正的方案為在對應的名稱前面加上命名空間 :
<?php
require_once "Debug.php";
use Jonny\Blog;
echo $a;
echo "<br />";
echo CON;
echo "<br />";
echo Debug\get();
$obj = new Debug\Foo();
$obj->func(1, 2, 3);
$obj->call();

此時就不再提示有致命錯誤
當然還有一種方法就是在宣告命名空間的時候, 宣告對應的名稱
<?php
require_once("Debug.php");
use Jonny\Debug;
use Jonny\Debug\Foo;
use function Jonny\Debug\get;
echo $a;
echo "<br />";
echo CON;
echo "<br />";
echo get();
$obj = new Foo();
$obj->func(1, 2, 3);
$obj->call();
最終的效果和上面是一樣的
當要使用命名空間內的函式的時候, 可以使用 :
use function NAME_SPACE\NameOfFunction; //不再需要 "()" 回調符
當要使用 const
常數的時候, 可以使用 :
use const NAME_SPACE\NameOfConstVar;
PHP 支持多重命名空間的導入
<?php
use Jonny\Debug\Namespace1,
Jonny\Debug\Namespace2;
當然, 我不建議這樣去做, 而是寫成 :
<?php
use Jonny\Debug\Namespace1;
use Jonny\Debug\Namespace2;
自創文章, 原著 : Jonny, 如若需要轉發, 在已經授權的情況下請註明出處 :《PHP 進階 : 命名空間》https://jonny.vip/2018/02/09/php-%e9%80%b2%e9%9a%8e-%e5%91%bd%e5%90%8d%e7%a9%ba%e9%96%93/
Leave a Reply