2024 日本 PHP 研討會

定義命名空間

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

雖然命名空間中可以包含任何有效的 PHP 程式碼,但只有以下類型的程式碼會受到命名空間的影響:類別(包括抽象類別和特性 (trait))、介面、函式和常數。

命名空間使用 `namespace` 關鍵字宣告。包含命名空間的檔案必須在檔案頂部、任何其他程式碼之前宣告命名空間 — 有一個例外:`declare` 關鍵字。

範例 #1 宣告單一命名空間

<?php
namespace MyProject;

const
CONNECT_OK = 1;
class
Connection { /* ... */ }
function
connect() { /* ... */ }

?>

注意在命名空間宣告中不允許使用完全限定名稱(即以反斜線開頭的名稱),因為此類結構會被解釋為相對命名空間表達式。

命名空間宣告之前唯一允許的程式碼結構是 declare 陳述式,用於定義原始碼檔案的編碼。此外,命名空間宣告之前不能有任何非 PHP 程式碼,包括額外的空白字元。

範例 #2 宣告單一命名空間

<html>
<?php
namespace MyProject; // 致命錯誤 - 命名空間必須是程式碼中的第一個陳述式
?>

此外,與其他 PHP 結構不同,相同的命名空間可以在多個檔案中定義,允許將命名空間的內容分散到整個檔案系統中。

新增註釋

使用者貢獻的註釋 10 則註釋

kuzawinski dot marcin at NOSPAM dot gmail dot com
10 年前
如果您的程式碼如下所示

<?php
namespace NS;
?>

... 而您仍然收到「命名空間宣告陳述式必須是程式碼中的第一個陳述式」的致命錯誤,那麼您可能使用了帶有位元組順序標記 (BOM) 的 UTF-8 編碼(UTF-8 編碼是好的,但 BOM 是不好的)。嘗試將您的檔案轉換為「不帶 BOM 的 UTF-8」,這樣應該就可以了。
danbettles at yahoo dot co dot uk
15 年前
關於在命名空間內使用 define() 定義的常數...

define() 將完全按照指定的內容定義常數。因此,如果您想在命名空間中定義常數,即使您是從命名空間內呼叫 define(),也需要在呼叫 define() 時指定命名空間。以下範例將使其更清楚。

以下程式碼將在全域命名空間(即「\MESSAGE」)中定義常數「MESSAGE」。

<?php
namespace test;
define('MESSAGE', 'Hello world!');
?>

以下程式碼將在「test」命名空間中定義兩個常數。

<?php
namespace test;
define('test\HELLO', 'Hello world!');
define(__NAMESPACE__ . '\GOODBYE', 'Goodbye cruel world!');
?>
anisgazig at gmail dot com
3 年前
PHP 檔案的開頭會定義命名空間宣告。
但在命名空間宣告之前,只允許三個元素。
1. declare 陳述式
2. 空格
3. 註解
FatBat
11 年前
補充 @danbettles 的說明,最好明確指定要使用哪個常數。

<?php
namespace NS;

define(__NAMESPACE__ .'\foo','111');
define('foo','222');

echo
foo; // 111。
echo \foo; // 222。
echo \NS\foo // 111。
echo NS\foo // 致命錯誤,會假設為 \NS\NS\foo。
?>
huskyr at gmail dot com
15 年前
「包含命名空間的檔案必須在檔案頂部,任何其他程式碼之前宣告命名空間」

這可能很明顯,但這表示您*可以*在 namespace 關鍵字之前包含註解和空白。

<?php
// 很多
// 有趣的
// 註解和空白

namespace Foo;
class
Bar {
}
?>
jeremeamia at gmail dot com
15 年前
您不應該嘗試建立使用 PHP 關鍵字的命名空間。這些會導致剖析錯誤。

範例

<?php
namespace Project/Classes/Function; // 導致剖析錯誤
namespace Project/Abstract/Factory; // 導致剖析錯誤
?>
dino at tuxweb dot it
2 年前
請注意,PHP 命名空間宣告不能以數字開頭。
我花了一些時間除錯...
匿名
16 年前
@ RS:此外,您可以指定 __autoload() 函式如何尋找檔案。這樣,其他使用者的命名空間類別就無法覆蓋您的類別,除非他們特別取代您的檔案。
Baptiste
16 年前
PHP 命名空間沒有任何問題,除了這兩個指令給人一種錯誤的套件管理印象。
... 而它們只是對應到 Javascript 的「with()」指令。

相比之下,套件是其成員的命名空間,但它提供了更多功能(例如部署設施),編譯器確切知道套件中有哪些類別,以及在哪裡可以找到它們。
anisgazig at gmail dot com
3 年前
命名空間名稱不區分大小寫。
namespace App

namespace app
意義相同。

此外,Namespace 關鍵字也不區分大小寫。
Namespace App
namespace App

NAMESPACE App
意義相同。
To Top