PHP 简明教程

PHP 命名空间

1. 什么是 PHP 命名空间?

命名空间(Namespaces)有两个主要作用:

  1. 解决命名冲突:允许在不同命名空间下定义同名的类、函数或常量。
  2. 提高代码可读性:通过分层组织代码,使大型项目的结构更加清晰。

想象一下,如果你在一个项目里引用了两个第三方库,而这两个库里居然都有一个叫 User 的类,那 PHP 编译器可就要“罢工”了。命名空间就像是给这些类套上了一个个“文件夹”,让它们各归其位。

2. 声明命名空间

在 PHP 中,使用 namespace 关键字来声明命名空间。

命名空间的声明必须是 PHP 脚本中的第一行代码(除了 declare 语句)。在 namespace 之前不能有任何代码、HTML 或空白字符。

代码示例:

<?php
namespace Html;

class Table {
  public $title = "";
  public $numRows = 0;
  public function message() {
    echo "<p>表名为 '{$this->title}',共有 {$this->numRows} 行。</p>";
  }
}

$table = new Table();
$table->title = "我的家谱";
$table->numRows = 5;
?>

<!DOCTYPE html>
<html>
<body>

<?php
$table->message();
?>

</body>
</html>

3. 嵌套命名空间

为了进一步细化组织结构,您可以声明嵌套的命名空间(子命名空间)。这通常用于表示项目的层级结构。

代码示例:

<?php
namespace MyProject\Database\Drivers;

class MySQL {
  // 数据库驱动代码...
}
?>

4. 使用命名空间

当您想在当前文件之外访问某个命名空间里的类时,有几种方式:

4.1 完全限定名称

直接使用完整的路径来实例化类:

$table = new Html\Table();

4.2 使用 use 关键字

通过 use 关键字将命名空间引入当前作用域,这样就可以直接使用类名了。

代码示例:

<?php
include "html.php";
use Html\Table;

$table = new Table();
$table->title = "产品清单";
$table->numRows = 10;
$table->message();
?>

5. 命名空间别名 (Aliasing)

有时候命名空间的名字可能非常长,或者你依然遇到了两个同名的类需要同时使用。这时,可以使用 as 关键字给它起个“外号”。

代码示例:

<?php
include "html.php";
use Html\Table as T;

$table = new T();
$table->title = "员工表";
$table->numRows = 20;
$table->message();
?>

5.1 同时引用多个带别名的类

如果你需要从不同的命名空间引用两个同名类,别名就是救命稻草:

<?php
use MyProject\UI\Table as UiTable;
use MyProject\Data\Table as DataTable;

$ui = new UiTable();
$data = new DataTable();
?>

6. 自动加载与命名空间

在现代 PHP 开发中,命名空间通常与 PSR-4 自动加载标准配合使用。

这意味着文件的目录结构会严格匹配命名空间。例如,命名空间为 App\Models\User 的类通常存储在 App/Models/User.php 文件中。通过使用 Composer 这样的包管理器,您甚至不需要手动写 include,系统会自动根据命名空间找到并加载对应的文件。

开发建议: 对于任何规模超过小型脚本的项目,始终建议使用命名空间。这是进入现代 PHP 框架(如 Laravel, Symfony)开发的“入场券”。