PHP 命名空间 namespace 入门详解
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 的规则
use只作用于当前文件,每个文件要单独引入;- 一个 use 只引入一个类,多个类用逗号或分行:
use App\Controller\User; use App\Model\Order; - 函数和常量在 PHP 8.0 前需要
use function、use const单独引入; - 开头的
\表示全局空间,比如\count()强制用全局函数,避免被当前空间的同名函数遮蔽。
五、非限定、限定、完全限定名
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/" }
}
}
命名空间写错或目录对不上,就会报“类未找到”。
七、常见误区
namespace写在 echo、HTML 之后,语法报错;- 以为 use 能跨文件自动继承,别的文件仍需重新 use;
- 类名冲突时不起别名,两个 use 同名类后者覆盖;
- 全限定名漏写开头反斜杠,被当成相对当前空间查找;
- 目录结构和命名空间层级不一致,自动加载失败。
八、总结
命名空间用 namespace 划分类、函数、常量的归属,避免重名冲突;引用用全限定名、use 或别名三种方式,use 按文件独立、配合 PSR-4 自动加载。写在文件顶部、层级与目录对应、注意反斜杠的全局含义,就能避开绝大部分命名空间报错。