如果您的代码如下所示
<?php
namespace NS;
?>
... 并且您仍然收到 "Namespace declaration statement has to be the very first statement in the script" 致命错误,那么您可能使用了带有字节顺序标记(BOM)的 UTF-8 编码(这很好)(这很糟糕)。尝试将您的文件转换为 "不带 BOM 的 UTF-8",它应该没问题。
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
尽管任何有效的 PHP 代码都可以包含在命名空间中,但只有以下类型的代码会受到命名空间的影响:类(包括抽象类和特质)、接口、函数和常量。
命名空间使用 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;
?>
... 并且您仍然收到 "Namespace declaration statement has to be the very first statement in the script" 致命错误,那么您可能使用了带有字节顺序标记(BOM)的 UTF-8 编码(这很好)(这很糟糕)。尝试将您的文件转换为 "不带 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
意思相同。