浅谈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 相关文章推荐
第十四节 命名空间 [14]
Oct 09 PHP
文件上传的实现
Oct 09 PHP
php数组中包含中文的排序方法
Jun 03 PHP
PHP的fsockopen、pfsockopen函数被主机商禁用的解决办法
Jul 08 PHP
PHP清除数组中所有字符串两端空格的方法
Oct 20 PHP
Laravel中扩展Memcached缓存驱动实现使用阿里云OCS缓存
Feb 10 PHP
Symfony2 session用法实例分析
Feb 04 PHP
在Yii2中使用Pjax导致Yii2内联脚本载入失败的原因分析
Mar 06 PHP
PHP插件PHPMailer发送邮件功能
Feb 28 PHP
php实现支持中文的文件下载功能示例
Aug 30 PHP
解决laravel 出现ajax请求419(unknown status)的问题
Sep 03 PHP
laravel 验证错误信息到 blade模板的方法
Sep 29 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
php 正则表达式小结
2009/08/31 PHP
PHP5 面向对象(学习记录)
2009/12/02 PHP
php中经典方法实现判断多维数组是否为空
2011/10/23 PHP
PHP使用gmdate实现将一个UNIX 时间格式化成GMT文本的方法
2015/03/19 PHP
PHP学习记录之常用的魔术常量详解
2019/12/12 PHP
IE event.srcElement和FF event.target 功能比较
2010/03/01 Javascript
弹出层之1:JQuery.Boxy (一) 使用介绍
2011/10/06 Javascript
各浏览器对document.getElementById等方法的实现差异解析
2013/12/05 Javascript
Google Maps API地图应用示例分享
2014/10/23 Javascript
jQuery实现仿Google首页拖动效果的方法
2015/05/04 Javascript
如何使用jQuery技术开发ios风格的页面导航菜单
2015/07/29 Javascript
jquery实现向下滑出的二级导航下滑菜单效果
2015/08/25 Javascript
JS判断是否长按某一键的方法
2016/03/02 Javascript
javascript中去除数组重复元素的实现方法【实例】
2016/04/12 Javascript
Ionic默认的Tabs模板使用实例
2016/08/29 Javascript
原生js实现图片放大缩小计时器效果
2017/01/20 Javascript
Javascript中toFixed计算错误(依赖银行家舍入法的缺陷)解决方法
2017/08/22 Javascript
利用canvas中toDataURL()将图片转为dataURL(base64)的方法详解
2017/11/20 Javascript
Electron + vue 打包桌面操作流程详解
2019/06/24 Javascript
微信小程序-API接口安全详解
2019/07/16 Javascript
Python字符转换
2008/09/06 Python
python爬虫爬取某站上海租房图片
2018/02/04 Python
Python浅复制中对象生存周期实例分析
2018/04/02 Python
Python对切片命名的实现方法
2018/10/16 Python
python读取并写入mat文件的方法
2019/07/12 Python
Python3实现监控新型冠状病毒肺炎疫情的示例代码
2020/02/13 Python
使用Python-OpenCV消除图像中孤立的小区域操作
2020/07/05 Python
Python3爬虫带上cookie的实例代码
2020/07/28 Python
Python学习工具jupyter notebook安装及用法解析
2020/10/23 Python
美国排名第一的在线葡萄酒商店:Wine.com
2016/09/07 全球购物
建材业务员岗位职责
2013/12/08 职场文书
基层干部2014全国两会学习心得体会
2014/03/10 职场文书
祖国在我心中演讲稿500字
2014/05/04 职场文书
公司催款律师函
2015/05/27 职场文书
暑假生活随笔
2015/08/15 职场文书
vue ref如何获取子组件属性值
2022/03/31 Vue.js