命名空间是PHP解决符号冲突的基础设施,非语法糖;必须声明在文件最顶部(BOM、空格、注释前均非法),支持子命名空间(用反斜杠分隔)、跨文件共享、匿名命名空间及use导入(含as别名、function/const导入),动态调用须用完全限定名称字符串,PSR-4自动加载为落地前提。
不是语法糖,它是 PHP 解决符号冲突的基础设施。没用命名空间,项目一上规模就容易在
、
这类通用名上踩坑——你写的和框架的、扩展的、同事的撞了,报错才找,晚了。
声明命名空间必须放在文件最顶上
哪怕只有一行空格、一个 UTF-8 BOM 或注释在
前,PHP 就直接报
。
是唯一允许出现在
之前的语句
子命名空间写法就是加反斜杠:
,不是
同一个命名空间可以跨多个文件,不用强求“一个命名空间一个文件”
匿名命名空间(即全局命名空间)用
包裹,但日常开发中极少需要
use 导入不是 include,它只改写名称解析路径
不会加载文件,也不执行任何代码,它只是告诉 PHP:“下次看到这个短名,按我指定的完整路径去查”。如果类不存在或路径不对,错误发生在真正
或调用时,而不是
那一行。
导入类:
,之后可用
导入函数(PHP 5.6+):
,否则
默认走当前命名空间下的同名函数
导入常量(PHP 5.6+):
别名必须用
:
,不能写成
动态调用必须用完全限定名称字符串
当你用变量构造类名、函数名或常量名时,
导入完全失效。PHP 不会在运行时去查导入表,它只认字符串字面量里的完整路径。
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
错误写法:
→ 解析为当前命名空间下的
,不是
正确写法:
,或者
函数同理:
,不能省略前导
或完整前缀
注意:字符串里反斜杠要转义或用单引号,双引号中写
会被当转义序列处理
PSR-4 自动加载不是可选项,是命名空间落地的前提
写了
没用——PHP 不知道该去哪找这个文件。不配自动加载,
必然报
。
立即学习
“
PHP免费学习笔记(深入)
”;
Composer 中配置:
,注意 JSON 里反斜杠要双写
对应文件路径必须严格匹配:
开头必须是
改完
后一定要运行
,否则新映射不生效
测试是否映射成功:运行
或直接
的核心约束不在写法多难,而在路径、声明位置、动态调用、自动加载这四点必须严丝合缝。漏掉任意一环,报错信息往往不指向真实原因,比如
其实是 PSR-4 路径配错了,而不是类名写错。
namespacenew Logger()validate()namespaceFatal error: Namespace declaration statement has to be the very first statementdeclare(strict_types=1);namespacenamespace AppServicesPayment;namespace App::Services::Payment;namespace { ... }usenewuseuse AppModelsUser;new User()use function array_filter;array_filter()use const JSON_THROW_ON_ERROR;asuse PsrLogLoggerInterface as Logger;use PsrLogLoggerInterface Logger;use$class = 'User'; $obj = new $class;UserAppModelsUser$class = 'AppModelsUser'; $obj = new $class;$class = AppModelsUser::class;$func = 'AppHelpersstr_slug'; $func();"AppModelsUser"namespace AppControllers;new AppControllersHomeController()Class not found"autoload": {"psr-4": {"App\": "src/"}}src/Controllers/HomeController.phpnamespace AppControllers;composer.jsoncomposer dump-autoloadcomposer show --platform | grep autoloadvar_dump(class_exists('AppControllersHomeController'));namespaceClass not found