ZetCode

PHP 命名空间关键字

最后修改于 2025 年 4 月 16 日

PHP namespace 关键字用于声明命名空间,这有助于组织代码并防止命名冲突。 命名空间对于现代 PHP 开发至关重要,尤其是在使用第三方库时。 它们提供了一种对相关类、接口和函数进行分组的方式。

基本定义

命名空间是标识符(类、函数、常量)的容器。 它有助于避免代码组件之间的名称冲突。 命名空间遵循类似于文件系统中目录的层次结构。

namespace 关键字必须是 PHP 文件中的第一个语句(除了 declare)。 命名空间可以包含子命名空间,用反斜杠 (\) 分隔。 全局代码驻留在未命名的全局命名空间中。

语法:namespace MyProject;namespace MyProject\Sub;。 使用 use 关键字导入命名空间或创建别名。 命名空间不区分大小写,但应遵循大小写约定。

基本命名空间声明

此示例演示了一个简单的命名空间声明和用法。

basic_namespace.php
<?php

declare(strict_types=1);

namespace MyApp;

class Logger {
    public function log(string $message): void {
        echo $message;
    }
}

$logger = new Logger();
$logger->log("Hello from namespace!");

代码声明了一个包含 Logger 类的 MyApp 命名空间。 类在同一命名空间内无需前缀即可引用。 在外部,它将是 MyApp\Logger。 命名空间有助于将代码组织成逻辑组。

子命名空间

此示例展示了如何创建和使用嵌套命名空间。

sub_namespace.php
<?php

declare(strict_types=1);

namespace MyApp\Database;

class Connection {
    public function connect(): void {
        echo "Database connected.";
    }
}

$conn = new Connection();
$conn->connect();

代码创建了 MyApp\Database 子命名空间。 Connection 类位于此嵌套命名空间中。 子命名空间有助于进一步组织相关组件。 它们反映了项目中的目录结构。

使用命名空间代码

此示例演示了如何使用来自其他命名空间的类。

use_namespace.php
<?php

declare(strict_types=1);

namespace MyApp;

use MyApp\Database\Connection;

$conn = new Connection();
$conn->connect();

use 语句从 Database 子命名空间导入 Connection 类。 导入后,我们可以直接引用该类。 如果没有 use,我们需要使用完全限定的名称。 这使代码更简洁、更具可读性。

命名空间别名

此示例展示了如何为命名空间类创建别名。

namespace_alias.php
<?php

declare(strict_types=1);

namespace MyApp;

use MyApp\Database\Connection as DBConnection;

$conn = new DBConnection();
$conn->connect();

as 关键字为 Connection 类创建别名。 这在处理长名称或名称冲突时很有用。 别名可以使代码更简洁。 它们在使用多个库时特别有用。

全局命名空间访问

此示例演示了如何访问全局命名空间函数。

global_namespace.php
<?php

declare(strict_types=1);

namespace MyApp;

function strlen(string $str): int {
    return \strlen($str) * 2; // Using global strlen
}

echo strlen("test"); // Outputs 8 (4*2)

反斜杠前缀访问全局命名空间。 在这里,我们覆盖了 strlen 但仍然使用原始版本。 这可以防止与 PHP 函数的命名冲突。 使用反斜杠前缀可以显式访问全局命名空间。

一个文件中的多个命名空间

此示例展示了如何在单个文件中声明多个命名空间。

multiple_namespaces.php
<?php

declare(strict_types=1);

namespace MyApp\First {
    class Example {
        public function show(): void {
            echo "First namespace";
        }
    }
}

namespace MyApp\Second {
    class Example {
        public function show(): void {
            echo "Second namespace";
        }
    }
}

$first = new \MyApp\First\Example();
$second = new \MyApp\Second\Example();

$first->show();
$second->show();

代码使用花括号语法声明了两个命名空间。 每个命名空间都包含一个具有不同实现的 Example 类。 这种方法通常不鼓励使用,但在某些情况下可能有用。 始终优先考虑每个文件一个命名空间。

命名空间常量和函数

此示例演示了在命名空间中定义常量和函数。

namespace_functions.php
<?php

declare(strict_types=1);

namespace MyApp\Utils;

const VERSION = "1.0";

function greet(string $name): string {
    return "Hello, $name!";
}

echo greet("John"); // Hello, John!
echo VERSION;      // 1.0

命名空间可以包含常量和函数,而不仅仅是类。 这些元素使用命名空间前缀进行访问。 命名空间中的常量始终区分大小写。 命名空间函数有助于以逻辑方式组织实用程序函数。

最佳实践

来源

PHP 命名空间文档

本教程通过实际示例介绍了 PHP 命名空间,展示了基本用法、子命名空间、别名和其他命名空间功能。

作者

我的名字是 Jan Bodnar,我是一个充满激情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出 所有 PHP 教程