定义命名空间

(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 结构不同,相同的命名空间可以在多个文件中定义,允许将命名空间的内容在文件系统中拆分。

添加注释

用户贡献的注释 10 个注释

kuzawinski dot marcin at NOSPAM dot gmail dot com
10 年前
如果您的代码如下所示

<?php
namespace NS;
?>

... 并且您仍然收到 "Namespace declaration statement has to be the very first statement in the script" 致命错误,那么您可能使用了带有字节顺序标记(BOM)的 UTF-8 编码(这很好)(这很糟糕)。尝试将您的文件转换为 "不带 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
14 年前
"包含命名空间的文件必须在任何其他代码之前在文件顶部声明命名空间"

可能很明显,但这意味着您可以在 namespace 关键字之前包含注释和空格。

<?php
// 很多
// 的
// 有趣的
// 注释和空格

namespace Foo;
class
Bar {
}
?>
jeremeamia at gmail dot com
15 年前
您不应该尝试创建使用 PHP 关键字的命名空间。这些会导致解析错误。

示例

<?php
namespace Project/Classes/Function; // 导致解析错误
namespace Project/Abstract/Factory; // 导致解析错误
?>
匿名
16 年前
@ RS:此外,您可以指定 __autoload() 函数如何查找文件。这样,其他用户的命名空间类就不会覆盖您的类,除非他们专门替换您的文件。
dino at tuxweb dot it
1 年前
请注意,PHP 命名空间声明不能以数字开头。
我花了一些时间调试...
Baptiste
16 年前
PHP 命名空间没有问题,除了这两个指令给出了对包管理的错误印象。
... 虽然它们只是对应于 Javascript 的 "with()" 指令。

相比之下,包是其成员的命名空间,但它提供了更多功能(例如部署工具),并且编译器确切地知道包中有哪些类以及在哪里找到它们。
anisgazig at gmail dot com
3 年前
命名空间名称不区分大小写。
namespace App

namespace app
意思相同。

此外,Namespace 关键字不区分大小写。
Namespace App
namespace App

NAMESPACE App
意思相同。
To Top