只写 use Image 我们怎么知道用的是哪个 Image 类?

只写use Image我们怎么知道用的是哪个Image类?Laravel又是怎么知道调用的是哪一个类?

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 11

首先去config/app.php 中查找 aliases 字段下的别名,发现并没有找到Image 类,这说明这个类不是 Laravel 内置模块。
然后尝试去我们刚装的 Intervention/image 扩展中查找,终于找到了:
vendor\intervention\image\src\Intervention\Image\Facades\Image.php

<?php

namespace Intervention\Image\Facades;

use Illuminate\Support\Facades\Facade;

class Image extends Facade
{
    ...
}

现在你明白了吗?

4年前 评论
kakaxi 3年前

这里我们使用use Image 其实使用的是第三方库intervention/image中的Intervention\Image\Facades\Image类,这个类继承Illuminate\Support\Facades\Facade, Facade是Laravel框架提供一种快捷访问核心类方法,可以把它称之为门面模式。

门面模式允许我们使用静态方式来调用方法,无需实例化对象,对我们要使用的类提供一组静态接口。Laravle默认就支持很多的Facade,可以在config/app.php配置文件下的alias选项就可以看到,如下所示:

'aliases' => [
        'App' => Illuminate\Support\Facades\App::class,
        'Mail' => Illuminate\Support\Facades\Mail::class,
        'Notification' => Illuminate\Support\Facades\Notification::class,
        'Password' => Illuminate\Support\Facades\Password::class,
      ....
    ],

可以看到它是一个关联数组,数组的键就是门面类的别名,比如我们在控制器中使用use App, 就相当于使用Illuminate\Support\Facades\App::class, 具体的原因是Laravel框架在运行时就去启动Facade引导程序(Illuminate\Foundation\Bootstrap\RegisterFacades),给所有的Facade类取别名(RegisterFacades::bootstrap)。 当我们使用use App时会使用Illuminate\Foundation\AliasLoader::load()来完成类的自动加载,由于类别名的原因找到Illuminate\Support\Facades\App类,最后使用composer的自动加载机制来加载对应的类文件

上面简单的介绍了Facade的工作机制,那我们引入的第三方扩展包Facade的别名在哪里呢,使用composer require intervention/image后,我们又使用了php artisan vendor:publish --provider="Intervention\Image\ImageServiceProviderLaravelRecent",这个命令会生成很多的内容,比如会生成一个配置文件image.php放置在config目录下,同时第三方扩展会生成一些信息存放在bootstrap/cache/packages.php文件中,其中就有Facade类的别名,Laravel框架在运行时会去加载pagckages.php文件,读取文件中的Facade信息, 在早期Laravel版本是不支持第三方扩展中的Facade类的

4年前 评论
Javy_coder (楼主) 4年前
zs4336 3年前
softer (作者) 3年前

如果没有限定命名空间,默认会在当前目录下寻找 image 类

4年前 评论

@Max 哦哦,那这个例子来说当前目录下也没有Image类呀?或者说我缺了哪部分的知识呢?

4年前 评论

@Javy_coder php 命名空间 方面的知识

4年前 评论

@Javy_coder 不是,这里直接 use 是因为命名空间被取成别名 Image 了.

4年前 评论
Epona

你可以了解一下 Facades

4年前 评论

use Intervention\Image\Facades\Image;

4年前 评论

首先去config/app.php 中查找 aliases 字段下的别名,发现并没有找到Image 类,这说明这个类不是 Laravel 内置模块。
然后尝试去我们刚装的 Intervention/image 扩展中查找,终于找到了:
vendor\intervention\image\src\Intervention\Image\Facades\Image.php

<?php

namespace Intervention\Image\Facades;

use Illuminate\Support\Facades\Facade;

class Image extends Facade
{
    ...
}

现在你明白了吗?

4年前 评论
kakaxi 3年前

正常会报错,课程里面应该少些了几个步骤,感觉这些扩展我们自己还是得学会如何使用。自己是这样解决的,根据库名到 GitHub 里面搜索,在介绍下面有一个集成到 Lavaral 的连接,点击进去就到了 http://image.intervention.io/getting_start... ,里面有介绍在 Laravel 不同版本中具体的使用步骤,看官方的文档肯定没差了,以后碰到了也不怕,哈哈。

4年前 评论

这里我们使用use Image 其实使用的是第三方库intervention/image中的Intervention\Image\Facades\Image类,这个类继承Illuminate\Support\Facades\Facade, Facade是Laravel框架提供一种快捷访问核心类方法,可以把它称之为门面模式。

门面模式允许我们使用静态方式来调用方法,无需实例化对象,对我们要使用的类提供一组静态接口。Laravle默认就支持很多的Facade,可以在config/app.php配置文件下的alias选项就可以看到,如下所示:

'aliases' => [
        'App' => Illuminate\Support\Facades\App::class,
        'Mail' => Illuminate\Support\Facades\Mail::class,
        'Notification' => Illuminate\Support\Facades\Notification::class,
        'Password' => Illuminate\Support\Facades\Password::class,
      ....
    ],

可以看到它是一个关联数组,数组的键就是门面类的别名,比如我们在控制器中使用use App, 就相当于使用Illuminate\Support\Facades\App::class, 具体的原因是Laravel框架在运行时就去启动Facade引导程序(Illuminate\Foundation\Bootstrap\RegisterFacades),给所有的Facade类取别名(RegisterFacades::bootstrap)。 当我们使用use App时会使用Illuminate\Foundation\AliasLoader::load()来完成类的自动加载,由于类别名的原因找到Illuminate\Support\Facades\App类,最后使用composer的自动加载机制来加载对应的类文件

上面简单的介绍了Facade的工作机制,那我们引入的第三方扩展包Facade的别名在哪里呢,使用composer require intervention/image后,我们又使用了php artisan vendor:publish --provider="Intervention\Image\ImageServiceProviderLaravelRecent",这个命令会生成很多的内容,比如会生成一个配置文件image.php放置在config目录下,同时第三方扩展会生成一些信息存放在bootstrap/cache/packages.php文件中,其中就有Facade类的别名,Laravel框架在运行时会去加载pagckages.php文件,读取文件中的Facade信息, 在早期Laravel版本是不支持第三方扩展中的Facade类的

4年前 评论
Javy_coder (楼主) 4年前
zs4336 3年前
softer (作者) 3年前

我一直以为这个配置是在 app根目录下的composer.json中;今天才发现原来是在扩展包中的composer.json中;。。。。之前让我疑惑了好久。。。。。

file

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!