Php 如何';使用';知道从哪里开始搜索文件吗?

Php 如何';使用';知道从哪里开始搜索文件吗?,php,namespaces,autoload,Php,Namespaces,Autoload,我在Laravel中创建了一个控制器,它使用以下use: use Illuminate\Http\Request; use Illuminate\Http\Request; 控制器如何知道在何处查找请求? 控制器本身位于: app\Http\Controllers\LoginController.php 但要求是: vendor\laravel\framework\src\Illuminate\Http\Request.php 那么为什么要使用: use Illuminate\Htt

我在Laravel中创建了一个控制器,它使用以下
use

use Illuminate\Http\Request;
use Illuminate\Http\Request;
控制器如何知道在何处查找
请求
? 控制器本身位于:

app\Http\Controllers\LoginController.php
但要求是:

vendor\laravel\framework\src\Illuminate\Http\Request.php


那么为什么
要使用

use Illuminate\Http\Request;
use Illuminate\Http\Request;
…而不是:

use vendor\laravel\framework\src\Illuminate\Http\Request;
这也行吗? 控制器如何知道从何处开始搜索

Laravel在其核心中使用了一个兼容的自动加载器


PSR-0和PSR-4标准规定了如何根据名称空间解析文件夹。laravel通过PHP帮助解析并包含正确的文件。

它基于应用程序通过类文件中的
名称空间
声明(通常是通过自动加载程序)向PHP提供的信息。默认情况下,将找不到您的类

可能是:

  • 您已手动包含这些文件
  • 您正在使用自动加载器
除非它是一个小项目,否则第一个选项很快就会变得难以管理,因此您最好探索第二个选项。正如@Koala Yeung提到的,PSR-0和PSR-4是普遍接受的方法

使用
spl_autoload_register
()注册自动加载器,这允许您编写一个函数,该函数在每次创建新对象时调用


如果运行
var_dump(spl_autoload_functions())
您将看到自动加载器Laravel已设置。

use
不知道在哪里可以找到文件,因为它引用的是类,而不是文件;希望自动加载器知道在哪里找到该类的文件。似乎有多个自动加载器,它如何知道哪一个是正确的?如果您使用composer进行自动加载,请检查目录
vendor/composer
,以读取自动加载器。它如何知道哪个自动加载器?它不。。。自动加载过程只是依次询问每个已注册的自动加载程序,直到其中一个加载了文件,或者没有正确响应(例如,一个写得不好的自动加载程序),或者询问了所有已注册的自动加载程序,但没有一个已找到该文件(在这种情况下,您会得到一个类未找到异常),如果我像我那样指定整个路径,它是否也能工作?e、 g.
使用vendor\laravel\framework\src\light\Http\Request不,不会。
use
关键字正在为该类使用。不是实际的文件路径。它们看起来很相似,因为PSR-0/PSR-4这样说。他们有效地说,“嘿,我们根据名称空间路径查找文件怎么样?”。您应该阅读更多详细信息。但是名称空间是
namespace-App\Http\Controllers
,那么他们为什么要使用
use-lightize\Http\Request而不是
使用..\..\light\Http\Request是否从名称空间开始?详细描述了他们建议如何解析文件路径。不同的供应商名称空间(例如,
照亮
)将解析为不同的文件夹。命名空间映射可以在项目根目录的中找到。另外,我不认为
。\..\..\light\Http\Request
是正确的命名空间格式。如果您阅读了,它会声明如果在本地找不到名称空间,则它将。因此,在您的情况下,如果未找到
\App\Http\Controllers\illumb\Http\Request
,它将回退并搜索
\illumb\Http\Request