如果您的程式碼如下所示
<?php
namespace NS;
?>
... 而您仍然收到「命名空間宣告陳述式必須是程式碼中的第一個陳述式」的致命錯誤,那麼您可能使用了帶有位元組順序標記 (BOM) 的 UTF-8 編碼(UTF-8 編碼是好的,但 BOM 是不好的)。嘗試將您的檔案轉換為「不帶 BOM 的 UTF-8」,這樣應該就可以了。
(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 結構不同,相同的命名空間可以在多個檔案中定義,允許將命名空間的內容分散到整個檔案系統中。
如果您的程式碼如下所示
<?php
namespace NS;
?>
... 而您仍然收到「命名空間宣告陳述式必須是程式碼中的第一個陳述式」的致命錯誤,那麼您可能使用了帶有位元組順序標記 (BOM) 的 UTF-8 編碼(UTF-8 編碼是好的,但 BOM 是不好的)。嘗試將您的檔案轉換為「不帶 BOM 的 UTF-8」,這樣應該就可以了。
關於在命名空間內使用 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!');
?>
補充 @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。
?>
「包含命名空間的檔案必須在檔案頂部,任何其他程式碼之前宣告命名空間」
這可能很明顯,但這表示您*可以*在 namespace 關鍵字之前包含註解和空白。
<?php
// 很多
// 有趣的
// 註解和空白
namespace Foo;
class Bar {
}
?>
您不應該嘗試建立使用 PHP 關鍵字的命名空間。這些會導致剖析錯誤。
範例
<?php
namespace Project/Classes/Function; // 導致剖析錯誤
namespace Project/Abstract/Factory; // 導致剖析錯誤
?>
PHP 命名空間沒有任何問題,除了這兩個指令給人一種錯誤的套件管理印象。
... 而它們只是對應到 Javascript 的「with()」指令。
相比之下,套件是其成員的命名空間,但它提供了更多功能(例如部署設施),編譯器確切知道套件中有哪些類別,以及在哪裡可以找到它們。
命名空間名稱不區分大小寫。
namespace App
和
namespace app
意義相同。
此外,Namespace 關鍵字也不區分大小寫。
Namespace App
namespace App
和
NAMESPACE App
意義相同。