浅谈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 相关文章推荐
随机广告显示(PHP函数)
Oct 09 PHP
PHP学习笔记之三 数据库基本操作
Jan 17 PHP
php删除字符串末尾子字符,删除开始字符,删除两端字符(实现代码)
Jun 27 PHP
PHP的Socket网络编程入门指引
Aug 11 PHP
PHP中file_get_contents函数抓取https地址出错的解决方法(两种方法)
Sep 22 PHP
分享php邮件管理器源码
Jan 06 PHP
thinkPHP模板算术运算相关函数用法分析
Jul 12 PHP
php添加数据到xml文件的简单例子
Sep 08 PHP
PHP进阶学习之垃圾回收机制详解
Jun 18 PHP
PHP封装cURL工具类与应用示例
Jul 01 PHP
Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示例
Oct 12 PHP
数据结构之利用PHP实现二分搜索树
Oct 25 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
coreseek 搜索英文的问题详解
2013/06/08 PHP
PHP中FTP相关函数小结
2016/07/15 PHP
php实现单笔转账到支付宝功能
2018/10/09 PHP
PHP实现简易用户登录系统
2020/07/10 PHP
jquery js 重置表单 reset()具体实现代码
2013/08/05 Javascript
JavaScript字符串对象split方法入门实例(用于把字符串分割成数组)
2014/10/16 Javascript
jQuery实现转动随机数抽奖效果的方法
2015/05/21 Javascript
浅谈JavaScript超时调用和间歇调用
2015/08/30 Javascript
jquery实现标题字体变换的滑动门菜单效果
2015/09/07 Javascript
微信小程序 wxapp导航 navigator详解
2016/10/31 Javascript
利用原生JS与jQuery实现数字线性变化的动画
2017/02/24 Javascript
几行js代码实现自适应
2017/02/24 Javascript
jQuery实现注册会员时密码强度提示信息功能示例
2017/09/05 jQuery
this.$toast() 了解一下?
2019/04/18 Javascript
vue缓存的keepalive页面刷新数据的方法
2019/04/23 Javascript
微信小程序如何使用云开发
2019/05/17 Javascript
小程序如何构建骨架屏
2019/05/29 Javascript
浅析Vue下的components模板使用及应用
2019/11/27 Javascript
antd-DatePicker组件获取时间值,及相关设置方式
2020/10/27 Javascript
Python实现的端口扫描功能示例
2018/04/08 Python
Django 跨域请求处理的示例代码
2018/05/02 Python
django admin 后台实现三级联动的示例代码
2018/06/22 Python
Python实现的括号匹配判断功能示例
2018/08/25 Python
python绘制动态曲线教程
2020/02/24 Python
Django import export实现数据库导入导出方式
2020/04/03 Python
HTML5 Plus 实现手机APP拍照或相册选择图片上传功能
2016/07/13 HTML / CSS
html5 canvas合成海报所遇问题及解决方案总结
2017/08/03 HTML / CSS
计算机应用专业毕业生求职信
2013/10/24 职场文书
经验丰富大学生村干部自我鉴定
2014/01/22 职场文书
园艺专业毕业生求职信
2014/09/02 职场文书
2015年六一儿童节活动总结
2015/02/11 职场文书
会计工作能力自我评价
2015/03/05 职场文书
大国崛起观后感
2015/06/02 职场文书
2016年秋季开学典礼新闻稿
2015/11/25 职场文书
2019个人工作总结
2019/06/21 职场文书
中学生打架检讨书之500字
2019/08/06 职场文书