PHP Conference Japan 2024

定义命名空间

(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 个注释

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

<?php
namespace NS;
?>

...并且您仍然收到“命名空间声明语句必须是脚本中的第一个语句”致命错误,那么您可能使用了 UTF-8 编码(这很好)并带有字节顺序标记,即 BOM(这不好)。尝试将您的文件转换为“无 BOM 的 UTF-8”,它应该可以正常工作。
142
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!');
?>
9
anisgazig at gmail dot com
3 年前
命名空间语句定义在 php 文件的开头。但是
在命名空间声明之前,只允许三个元素。
1.declare 语句
2.空格
3.注释
84
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.
?>
65
huskyr at gmail dot com
15 年前
“包含命名空间的文件必须在任何其他代码之前在文件顶部声明命名空间”

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

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

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

示例

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

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

namespace app
含义相同。

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

NAMESPACE App
含义相同。
To Top