在單一 PHP 檔案中使用全域命名空間和多個命名空間會增加複雜性並降低程式碼的可讀性。
即使非常必要(雖然並非如此),也盡量不要使用這種方案。
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
同一個檔案中也可以宣告多個命名空間。允許兩種語法。
範例 #1 宣告多個命名空間,簡單的組合語法
<?php
namespace MyProject;
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
namespace AnotherProject;
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
?>
不建議使用這種語法將多個命名空間合併到單一檔案中。建議改用另一種括號語法。
範例 #2 宣告多個命名空間,使用括號語法
<?php
namespace MyProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
namespace AnotherProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
?>
強烈不建議將多個命名空間合併到同一個檔案中,這種做法並非良好的程式碼撰寫習慣。主要用途是將多個 PHP 腳本合併到同一個檔案中。
若要將全域非命名空間程式碼與命名空間程式碼合併,僅支援括號語法。全域程式碼應包含在沒有命名空間名稱的命名空間陳述式中,如下所示:
範例 #3 宣告多個命名空間和非命名空間程式碼
<?php
namespace MyProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
namespace { // 全域程式碼
session_start();
$a = MyProject\connect();
echo MyProject\Connection::start();
}
?>
除了開頭的 declare 陳述式之外,命名空間括號外不能有任何 PHP 程式碼。
範例 #4 宣告多個命名空間和非命名空間程式碼
<?php
declare(encoding='UTF-8');
namespace MyProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
namespace { // 全域程式碼
session_start();
$a = MyProject\connect();
echo MyProject\Connection::start();
}
?>
在單一 PHP 檔案中使用全域命名空間和多個命名空間會增加複雜性並降低程式碼的可讀性。
即使非常必要(雖然並非如此),也盡量不要使用這種方案。
<?php
// 您不能將帶括號的命名空間宣告與不帶括號的命名空間宣告混合使用 - 這將導致致命錯誤
namespace a;
echo "我屬於命名空間 a";
namespace b {
echo "我來自命名空間 b";
}
<?php
// 命名空間也可以這樣使用
namespace MyProject {
function connect() { echo "一"; }
Sub\Level\connect();
}
namespace MyProject\Sub {
function connect() { echo "二"; }
Level\connect();
}
namespace MyProject\Sub\Level {
function connect() { echo "三"; }
\MyProject\Sub\Level\connect(); // 或者我們可以使用以下方式
connect();
}
如果你的測試檔案習慣使用 PHP 結束標籤「?>」,請記住,使用括號語法時,括號外的程式碼(包括 PHP 標籤外的新行)是不允許的。尤其是,即使 PHP 將結束標籤後的新行視為該行的一部分並將其忽略,但在 Ubuntu 中,一些編輯器(例如 Gedit、Gvim、Vim 和 Nano)會在這個新行之後再新增一個新行,這將會導致錯誤。
將多個命名空間合併到單個檔案中的做法不僅合理,而且在某些情況下絕對必要。一個例子是相當熱門的 phpseclib 函式庫,它符合 PSR-4 規範,但為了符合規範,它必須讀取一個檔案目錄才能知道有哪些類別可用,以便自動載入器可以載入正確的檔案。如果他們改用 PHP 核心已支援的機制,將預設值捆綁到一個檔案中,就不需要額外掃描檔案系統了。
這只是一個合理的案例,說明嚴格遵守 PSR 有時會阻礙良好的軟體開發。
//使用命名空間呼叫同名函式
//food.php
<?php
namespace Food;
require ('Apple.php');
require('Orange.php');
use Apples;
use Oranges;
Apples\eat();
Oranges\eat();
?>
//Apple.php
<?php
namespace Apples;
function eat()
{
echo "eat apple";
}
?>
//Orange.php
<?php
namespace Oranges;
function eat()
{
echo "eat Orange";
}
?>