PHP 命名空间

在 PHP 中,命名空间(Namespace)是用来解决代码内部的命名冲突问题的。它可以让你将相关的类、函数和常量组织到一个独立的空间中,从而避免命名上的混乱。

基本语法

在 PHP 脚本的最开始部分,定义命名空间使用关键字 namespace。如果你想将类放置在一个命名空间中,可以这样做:

<?php
namespace MyProject;

class MyClass {}

function myFunction() {}

const MY_CONSTANT = 'value';
?>

在上面的例子中,我们定义了一个名为 MyProject 的命名空间。类 MyClass、函数 myFunction 和常量 MY_CONSTANT 都被放置在这个命名空间中。

使用命名空间

要访问命名空间中的元素,可以使用完全限定名称(Fully Qualified Name)。例如:

$object = new MyProject\MyClass();
$value = MyProject\myFunction();
$constant = MyProject\MY_CONSTANT;

也可以使用 use 关键字来导入特定的元素到当前命名空间,这样就可以直接访问它们了:

<?php
namespace AnotherNamespace;

// import MyClass from the "MyProject" namespace
use MyProject\MyClass;

$object = new MyClass();
?>

命名空间的层级结构

命名空间可以有多个层级,每一级之间用反斜线(\)分隔。例如:

<?php
namespace MyProject\Sub\Level;

class MyClass {}
?>

这里定义了一个三级的命名空间 MyProject\Sub\Level,类 MyClass 被放置在其中。

全局代码和非限定名称

如果你想访问全局代码(不属于任何命名空间的代码),可以使用前缀 \。例如:

$object = new \MyClass();

这将创建一个全局类 MyClass 的实例,而不是当前命名空间中的同名类。

在声明类、函数和常量时,如果没有指定命名空间,它们就会被放置在全局代码中。这意味着可以使用非限定名称来访问它们:

<?php
namespace MyProject;

function strlen() {} // Declares a function named "strlen" in the current namespace.

$len = strlen('hi'); // Calls \MyProject\strlen().
$len = \strlen('hi'); // Calls global function strlen().
?>

命名空间和自动加载

在大型项目中,手动包含所有需要的文件是不现实的。PHP 提供了一个自动加载机制来帮助解决这个问题。当你想使用尚未被定义的类时,自动加载器会尝试从硬盘上加载它。

要使用自动加载功能,需要注册一个自动加载函数,通常放置在项目的启动文件中:

<?php
spl_autoload_register(function ($class) {
    include str_replace('\\', '/', $class) . '.php';
});
?>

这个自动加载函数将类名转换为文件路径,并尝试包含该文件。如果文件不存在或者没有定义所需的类,则会引发错误。