use
语句纯粹是一种在特定文件中为不同命名空间中的符号(如类、函数、枚举等)提供简写的方式。请参阅 PHP 手册中的 使用命名空间:别名/导入 。它允许你编写 echo FooTypes::A->value;
而不是 echo \App\Helpers\FooTypes::A->value;
,但这正是它所做的一切。
这一点与如何加载特定符号的定义完全无关。对于这一点,你可能依赖于 自动加载 ,即在首次使用特定类、枚举等时运行回调函数。回调函数通常会包含定义该符号的文件。
明确一点,使用 use
语句为符号定义别名,并不会触发自动加载器运行。只有实际 执行需要该定义的代码 时,才会触发自动加载器。
最常见的约定是将每个定义放入单独的文件中,然后配置自动加载器根据名称加载文件;但这只是一个 约定 。如果你想采用不同的约定,比如任何以 "Types" 结尾的名称都与不带该后缀的类位于同一文件中,你可以编写一个实现这种约定的自动加载函数。例如:
function my_autoload_callback(string $nameToLoad): void {
$filePath = PROJECT_ROOT . '/' . str_replace('\\', '/', $nameToLoad) . '.php';
if (file_exists($filePath)) {
require_once $filePath;
} else {
// 尝试去掉末尾的 "Types"
// 这里应该再进行一次文件存在性检查
require_once str_replace('Types.php', '.php', $filePath);
// 我们可以在这里检查是否找到了正确的类
}
// 如果函数在这儿还没有加载所需的类,
// PHP 将抛出一个 “未找到类” 的错误
}
请注意,自动加载器并不知道它正在查找的是类、接口、特性还是枚举;你唯一能得到的输入是完全限定名称,例如 "App\Helpers\FooTypes"
。