«

PHP 命名空间 namespace 入门详解

时间:2026-11-15 07:23     作者:emer     分类: 无


PHP 命名空间 namespace 入门详解

一、命名空间解决什么问题

随着项目变大、引入第三方库,两个类同名(比如都叫 User)就会冲突,函数、常量重名也会报错。命名空间(namespace)相当于给代码划分独立隔间,让同名类在不同隔间里互不干扰,也是 Composer 自动加载 PSR-4 的基础。

二、基本声明

namespace 必须写在文件最顶部,前面不能有输出:

<?php
namespace App\Controller;

class User
{
    public function show()
    {
        return '控制器里的用户';
    }
}

反斜杠 \ 是层级分隔符,App\Controller 表示嵌套命名空间。

三、三种引用方式

在别的命名空间里使用这个类,有三种写法:

<?php
namespace App\View;

// 1. 全限定名,带开头反斜杠,从全局根开始找
$a = new \App\Controller\User();

// 2. use 引入后直接用(最常用)
use App\Controller\User;
$b = new User();

// 3. 起别名,类名冲突时用
use App\Controller\User as ControllerUser;
$c = new ControllerUser();

四、use 的规则

五、非限定、限定、完全限定名

namespace App\Controller;

new User();              // 非限定名,当前空间内找
new Model\User();        // 限定名,相对当前空间
new \App\Model\User();  // 完全限定名,从根开始

六、结合自动加载

命名空间路径要和目录结构对应,PSR-4 下 App\Controller\User 对应 App/Controller/User.php,Composer 据此自动 require:

{
  "autoload": {
    "psr-4": { "App\\": "app/" }
  }
}

命名空间写错或目录对不上,就会报“类未找到”。

七、常见误区

  1. namespace 写在 echo、HTML 之后,语法报错;
  2. 以为 use 能跨文件自动继承,别的文件仍需重新 use;
  3. 类名冲突时不起别名,两个 use 同名类后者覆盖;
  4. 全限定名漏写开头反斜杠,被当成相对当前空间查找;
  5. 目录结构和命名空间层级不一致,自动加载失败。

八、总结

命名空间用 namespace 划分类、函数、常量的归属,避免重名冲突;引用用全限定名、use 或别名三种方式,use 按文件独立、配合 PSR-4 自动加载。写在文件顶部、层级与目录对应、注意反斜杠的全局含义,就能避开绝大部分命名空间报错。

标签: PHP PSR-4 namespace 命名空间