PHP namespace必须位于文件顶部(declare后),子命名空间用反斜杠分隔;use仅缩短书写,不加载类;PSR-4要求namespace与目录路径严格匹配,文件名须与类名一致;__NAMESPACE__是编译时常量,动态获取类命名空间应使用ReflectionClass。

namespace 声明必须在文件最顶部(除 declare 外)
PHP 的 namespace 不是“作用域开关”,而是文件级命名空间绑定。一旦写错位置,直接报错或行为异常。
-
declare(如declare(strict_types=1))是唯一允许在namespace之前出现的语句;其他任何代码(包括空行、注释、require)都会导致Parse error: Syntax error, unexpected 'namespace' - 如果用了
declare,它和namespace之间不能有空行——PHP 解析器会把它当作两个独立语句,而第二行的namespace就失效了 - 子命名空间用反斜杠分隔,比如
AppControllersAdmin,不是点号或冒号
use 和 fully qualified name 的选择逻辑
引入类时,use 是为缩短书写,不是“加载”或“导入”——类仍按 PSR-4 规则自动加载。选哪种写法,取决于可读性与上下文冲突风险。
- 同名类冲突时(比如你写了
AppDateTime,又想用DateTime),必须用use DateTime或new DateTime()显式指定全局命名空间 -
use后可以起别名:use AppServicesCache as CacheService;,避免和本地变量$cache混淆 - 函数/常量不能通过
use引入(PHP 5.6+ 支持use function和use const,但需明确写出,且不推荐在业务代码中滥用)
PSR-4 自动加载里 namespace 和目录路径强绑定
Composer 的 PSR-4 加载不是“猜路径”,而是严格按 vendor/composer/autoload_psr4.php 里注册的映射来拼接。写错一个字母,类就找不到。
- 假设
"App\": "src/",那么AppControllersUserController必须放在src/Controllers/UserController.php,中间不能多一层app或少一层Controllers - 文件名必须和类名完全一致(大小写敏感!Linux 下
usercontroller.php会加载失败) - 命名空间末尾不加反斜杠(
AppControllers✅,AppControllers❌),否则 PSR-4 映射会多拼一个/,路径出错
__NAMESPACE__ 和 get_namespace() 这类动态操作容易误用
__NAMESPACE__ 是编译时常量,只反映当前文件声明的命名空间;它不会因 use 或运行时调用而改变。拿它拼路径或反射类名时,很容易漏掉子命名空间层级。
立即学习“PHP免费学习笔记(深入)”;
-
__NAMESPACE__在全局空间下是空字符串,不是"\";判断时建议用empty(__NAMESPACE__)而非__NAMESPACE__ === ''(虽等价,但更直觉) - 想获取某个类的完整命名空间,用
(new ReflectionClass($obj))->getNamespaceName(),而不是靠__NAMESPACE__+ 类名硬拼——后者在 trait 或匿名类里完全不可靠 - 动态 new 类时,带命名空间的字符串必须用双反斜杠转义或单引号:例如
'App\Models\User',写成"AppModelsUser"会被 PHP 当作换行符处理











