use语句仅导入类、接口、trait,不能导入函数或变量;PHP 7.4+ 支持use function和use const,但需显式声明前缀,且use本身不加载文件,仅创建别名。

use语句只能导入类、接口、trait,不能导入函数或变量
很多人误以为 use 能像 Python 的 from ... import 那样导入任意东西,其实它只作用于命名空间中的「命名类型」。你写 use DateTime; 是合法的,但 use array_filter; 或 use $config; 会直接报错:「Syntax error, unexpected 'array_filter'」。
如果需要使用其他命名空间下的函数,得靠 function 前缀(PHP 7.4+ 支持)或完整限定名:
use function MyLib\helper; helper(); // ✅ PHP 7.4+ 允许这样导入函数
不过更常见的是直接调用:\MyLib\helper() —— 注意开头的反斜杠表示绝对命名空间。
use后面不能带括号,也不能跟new或require
use 是编译期指令,不是运行时操作。下面这些全是错的:
立即学习“PHP免费学习笔记(深入)”;
-
use SomeClass();→ 报错:unexpected '(' -
use new SomeClass();→ 语法错误,new不是关键字的一部分 -
use require 'path/to/file.php';→ 完全无效,require和use无任何关系
正确写法只有三种基本形式:
use Vendor\Package\ClassName;use Vendor\Package\ClassName as MyClass;-
use Vendor\Package\{ClassA, ClassB, InterfaceC};(PHP 7.0+ 支持花括号批量导入)
别名冲突时,as不是可选而是必须项
当两个类同名(比如都叫 Logger),又都需要在当前文件中使用,就必须用 as 显式重命名:
use Monolog\Logger; use Psr\Log\LoggerInterface as PsrLogger;
否则会触发致命错误:Fatal error: Cannot use Monolog\Logger as Logger because the name is already in use。注意:即使你只用了其中一个,只要另一个出现在 use 列表里,就构成冲突。
常见陷阱:
- IDE 自动生成
use时可能漏掉as,手动检查很有必要 -
as后的名字区分大小写,as logger和as Logger是不同标识符 - 别名不能和 PHP 内建类重名(如
as Exception),否则运行时报错
use不加载文件,autoload 才负责实际引入
use 只是告诉 PHP「这个短名对应哪个完整命名空间」,它本身不包含任何文件、不执行任何代码。真正加载类文件的是自动加载器(如 Composer 的 autoload.php)。如果你看到 Class 'XXX' not found,问题几乎一定出在 autoload 配置或文件路径上,而不是 use 写错了。
验证方式很简单:
- 删掉
use行,改用完整名:$x = new \Full\Namespace\Classname();—— 如果还报错,就是 autoload 问题 - 确认类文件存在且命名规范(如
App\Services\UserService.php里必须声明namespace App\Services;) - 运行
composer dump-autoload(尤其修改了 classmap 或 files 配置后)
最常被忽略的一点:命名空间声明必须与目录结构严格一致,差一个斜杠或大小写错误,autoload 就找不到文件。



















