浅谈laravel aliases别名的原理


Posted in PHP onOctober 24, 2019

在laravel发现有些类可以直接use 类名,就能使用了,例如use DB;就可以使用DB类了,问题是DB这个类并不在根命名空间,这里面实际就是用到了别名。

先通过如下例子来分析基本原理

建立如下文件upload.php,内容为

<?php
namespace test\test2;
class upload{
 public function test(){
 return 123;
 }
}

2 建立文件index.php,内容为

<?php
namespace b;
require('upload.php');
class_alias ( '\test\test2\upload' , 'upload');
$a=new \upload();
echo $a->test();

浏览器执行index.php,成功输出结果123;

可以看到class upload在命名空间test\test2下 但是new upload的时候 并没有new \test\test2\upload 而是直接new \upload,原因不多说,就是因为函数class_alias导致的.具体的这个函数的用法可以参考手册。这里要补充说明class_alias的第3个参数默认为true,手册上的意思是Whether to autoload if the original class is not found.是什么意思了,还是通过例子说明 ,把index.php修改如下

<?php
namespace b;
//require('upload.php');
spl_autoload_register(function($class){
$num=strrpos($class,'\\');
$num++;
$file=substr($class, $num).'.php';
require($file);
});
 
class_alias ( '\test\test2\upload' , 'upload');
$a=new \upload();
echo $a->test();

可以看到我注释掉了require('upload.php'),但是代码还是成功执行了。有了上面的例子说明,就能看懂laravel的别名实现机制了.

在laravel中,比方说我需要使用Log类,我们通过use Log; Log::info();就能使用记录日志了.下面来分析原理

laravel的加载过程这里不分析,中间有一步会执行如下这个'Illuminate\Foundation\Bootstrap\RegisterFacades'的bootstrap方法;

class RegisterFacades 
{ 
  public function bootstrap(Application $app) 
  { 
    //......省略...... 
    AliasLoader::getInstance($app->make('config')->get('app.aliases'))->register(); 
  } 
}

$app->make('config')->get('app.aliases')这一步读取了config文件夹下的app.php的配置文件,这个配置文件里面我们定义了别名列表.

意思就是说如果是需要使用别名 ,必须在配置文件中注册别名

例如配置文件中有一行配置为'Log' => Illuminate\Support\Facades\Log::class,

继续追踪执行流程,代码会执行到这一步

public function load($alias) 
{ 
  if (isset($this->aliases[$alias])) { 
    return class_alias($this->aliases[$alias], $alias); 
  } 
}

到了这里 ,看了之前的原理的人应该都明白了,我们new Log类 ,根据我们的配置'Log' => Illuminate\Support\Facades\Log::class,实际上是调用的Illuminate\Support\Facades\Log这个类, 可是Illuminate\Support\Facades\Log里并没有info方法,这是如何实现的了,可以百度facade原理,这里不细说,这里实际上调用的是是从容器里面获取到了log对象,那么这个log对象是什么时候注册到容器里面去的了,

protected $bootstrappers = [ 
  'Illuminate\Foundation\Bootstrap\DetectEnvironment', 
  'Illuminate\Foundation\Bootstrap\LoadConfiguration', 
  'Illuminate\Foundation\Bootstrap\ConfigureLogging', 
  'Illuminate\Foundation\Bootstrap\HandleExceptions', 
  'Illuminate\Foundation\Bootstrap\RegisterFacades', 
  'Illuminate\Foundation\Bootstrap\RegisterProviders', 
  'Illuminate\Foundation\Bootstrap\BootProviders', 
];

这块代码,看过源码的人都应该熟悉了,在ConfigureLogging这个文件里就会将log注册到容器里面.这样一个完整的流程就结束了

以上这篇浅谈laravel aliases别名的原理就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
Win9x/ME下Apache+PHP安装配置
Oct 09 PHP
PHP输出控制功能在简繁体转换中的应用
Oct 09 PHP
?算你??的 PHP 程式大小
Dec 06 PHP
采用header定义为文件然后readfile下载(隐藏下载地址)
Jan 31 PHP
PHP实现货币换算的方法
Nov 29 PHP
php数组键值用法实例分析
Feb 27 PHP
WordPress主题制作之模板文件的引入方法
Dec 28 PHP
PHP中phar包的使用教程
Jun 14 PHP
PHP多个图片压缩成ZIP的方法
Aug 18 PHP
PHP经典设计模式之依赖注入定义与用法详解
May 21 PHP
PHP Swoole异步读取、写入文件操作示例
Oct 24 PHP
如何在PHP环境中使用ProtoBuf数据格式
Jun 19 PHP
Laravel 模型使用软删除-左连接查询-表起别名示例
Oct 24 #PHP
laravel model 两表联查示例
Oct 24 #PHP
Laravel框架之解决前端显示图片问题
Oct 24 #PHP
laravel中的fillable和guarded属性详解
Oct 23 #PHP
laravel5.6中的外键约束示例
Oct 23 #PHP
laravel5.6实现数值转换
Oct 23 #PHP
laravel框架之数据库查出来的对象实现转化为数组
Oct 23 #PHP
You might like
用缓存实现静态页面的测试
2006/12/06 PHP
PHP中PDO的错误处理
2011/09/04 PHP
php比较相似字符串的方法
2015/06/05 PHP
php反射类ReflectionClass用法分析
2016/05/12 PHP
详解Laravel视图间共享数据与视图Composer
2016/08/04 PHP
jQuery 创建Dom元素
2010/05/07 Javascript
JavaScript中的prototype.bind()方法介绍
2014/04/04 Javascript
jQuery中toggle()函数的使用实例
2015/04/17 Javascript
JS简单实现DIV相对于浏览器固定位置不变的方法
2016/06/17 Javascript
javascript insertAfter()定义与用法示例
2016/07/25 Javascript
聊一聊JS中的prototype
2016/09/29 Javascript
vue.js选中动态绑定的radio的指定项
2017/06/02 Javascript
js处理包含中文的字符串实例
2017/10/11 Javascript
Angular实现的敏感文字自动过滤与提示功能示例
2017/12/29 Javascript
vue实现前进刷新后退不刷新效果
2018/01/26 Javascript
微信小程序页面生命周期详解
2018/01/31 Javascript
如何根据业务封装自己的功能组件
2019/04/19 Javascript
Layer组件多个iframe弹出层打开与关闭及参数传递的方法
2019/09/25 Javascript
jQuery 隐藏/显示效果函数用法实例分析
2020/05/20 jQuery
python中文分词教程之前向最大正向匹配算法详解
2017/11/02 Python
详解如何使用Python编写vim插件
2017/11/28 Python
基于python神经卷积网络的人脸识别
2018/05/24 Python
python hook监听事件详解
2018/10/25 Python
python如何实现一个刷网页小程序
2018/11/27 Python
python中使用 xlwt 操作excel的常见方法与问题
2019/01/13 Python
学python安装的软件总结
2019/10/12 Python
python切割图片的示例
2020/11/12 Python
python中绕过反爬虫的方法总结
2020/11/25 Python
HTML5中FileReader接口使用方法实例详解
2017/08/26 HTML / CSS
HTML5 Canvas之测试浏览器是否支持Canvas的方法
2015/01/01 HTML / CSS
施工安全汇报材料
2014/08/17 职场文书
作风整顿剖析材料
2014/09/30 职场文书
初中班干部工作总结
2015/08/10 职场文书
详解盒子端CSS动画性能提升
2021/05/24 HTML / CSS
Node.js实现爬取网站图片的示例代码
2022/04/04 NodeJs
在MySQL中你成功的避开了所有索引
2022/04/20 MySQL