Php 如何';使用';知道从哪里开始搜索文件吗?
我在Laravel中创建了一个控制器,它使用以下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
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
。