结论是类未定义而非 require_once 未执行;常见原因有路径错误、命名空间遗漏、文件语法错误、自动加载未生效,需检查 User.php 开头是否正确定义类。

直接说结论:不是 require_once 没执行,而是它加载的文件里没真正定义出那个类——常见于路径错、命名空间漏、文件语法错、自动加载未生效这四类情况。
require_once 执行了但类还是不存在
现象是 require_once 'User.php'; 没报错,但紧接着 new User() 就抛 Fatal error: Class 'User' not found。说明文件被读进来了,但 PHP 解析后没注册这个类。
- 检查
User.php文件开头是否有<?php开标签(缺了就当纯文本处理) - 运行
php -l User.php看是否语法错误(比如少括号、中文标点、BOM 头) - 确认文件里真有
class User { ... },而不是只写了namespace AppModels;却忘了 class 定义 - 如果用了命名空间,
class User实际全名是AppModelsUser,不能直接new User()
命名空间声明了但 new 时仍报错
类文件里写了 namespace AppModels;,也 require_once 成功了,但 new User() 还失败——这是最典型的“以为引入了,其实没映射上”。
- 必须用完整限定名:
new AppModelsUser(),或在使用前加use AppModelsUser; -
use必须写在命名空间声明之后、类实例化之前,且不能在函数体内(除非是动态调用) - 如果项目用 Composer,确保
composer.json的"psr-4"配置里"App\": "app/"的反斜杠是双写、路径末尾有斜杠 - 改完配置必须跑
composer dump-autoload -o,否则缓存不更新
相对路径导致 require_once 加载了错误文件
你在 controller/Order.php 里写 require_once '../model/User.php';,看似合理,但实际加载的是 ../model/User.php 目录下另一个同名却没定义 User 类的文件。
立即学习“PHP免费学习笔记(深入)”;
- 用
var_dump(realpath('../model/User.php'));确认到底打开了哪个物理路径 - Linux/macOS 下
User.php和user.php是两个文件,大小写必须完全一致 - 避免相对路径嵌套,统一用
__DIR__ . '/../model/User.php'构造绝对路径 - 如果框架有自动加载机制(如 Laravel、ThinkPHP),优先关掉手写
require_once,走标准 PSR-4 流程
Composer 自动加载没覆盖到你的类
你新增了一个 app/Utils/Helper.php,里面定义了 class Helper,但 new Helper() 依然失败——因为 Composer 根本不知道这个路径。
- 检查
composer.json的autoload是否包含该目录,例如:"psr-4": { "App\Utils\": "app/Utils/" } - 路径中所有反斜杠必须是双写
\,单个会被 PHP 当转义符处理 - 执行
composer dump-autoload后,打开vendor/composer/autoload_psr4.php,搜Helper看是否已写入映射 - 如果类不在标准 PSR 路径下,可用
"files": ["app/Utils/Helper.php"]强制全局加载
最容易被忽略的一点:require_once 成功只代表文件读进来了,不代表类就“活”了。PHP 解析文件时只要遇到语法错误、命名空间错位、或 class 定义被条件语句包裹(比如 if (false) { class User {} }),类就不会注册到运行时符号表里——这种问题不会在 require_once 行报错,而是在第一次 new 或 class_exists() 时才暴露。



















