浅谈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 相关文章推荐
一个阿拉伯数字转中文数字的函数
Oct 09 PHP
PHP curl 并发最佳实践代码分享
Sep 05 PHP
ThinkPHP3.1基础知识快速入门
Jun 19 PHP
php绘图之生成饼状图的方法
Jan 24 PHP
php使用Image Magick将PDF文件转换为JPG文件的方法
Apr 01 PHP
PHP基于yii框架实现生成ICO图标
Nov 13 PHP
thinkphp微信开之安全模式消息加密解密不成功的解决办法
Dec 02 PHP
PHP邮箱验证示例教程
Jun 01 PHP
详解thinkphp中的volist标签
Jan 15 PHP
TP5(thinkPHP框架)实现后台清除缓存功能示例
May 29 PHP
Laravel 简单实现Ajax滚动加载示例
Oct 22 PHP
PHP基于ip2long实现IP转换整形
Dec 11 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
仿Aspnetpager的一个PHP分页类代码 附源码下载
2012/10/08 PHP
解决php表单重复提交实现方法
2015/09/29 PHP
thinkphp中多表查询中防止数据重复的sql语句(必看)
2016/09/22 PHP
搭建PhpStorm+PhpStudy开发环境的超详细教程
2020/09/17 PHP
jQuery的学习步骤
2011/02/23 Javascript
JavaScript高级程序设计(第3版)学习笔记10 再访js对象
2012/10/11 Javascript
JS实现侧悬浮浮动实例代码
2013/11/29 Javascript
javascript 处理null及null值示例
2014/06/09 Javascript
easyui Droppable组件实现放置特效
2015/08/19 Javascript
JavaScript中的Array 对象(数组对象)
2016/06/02 Javascript
AngularJS入门教程之更多模板详解
2016/08/19 Javascript
JS中常用的正则表达式
2016/09/29 Javascript
hovertree插件实现二级树形菜单(简单实用)
2016/12/28 Javascript
JS数组方法shift()、unshift()用法实例分析
2020/01/18 Javascript
JS数组方法reverse()用法实例分析
2020/01/18 Javascript
VSCode插件安装完成后的配置(常用配置)
2020/08/24 Javascript
详解Python中的Descriptor描述符类
2016/06/14 Python
Python变量和数据类型详解
2017/02/15 Python
python中kmeans聚类实现代码
2018/02/23 Python
Python实现的基于优先等级分配糖果问题算法示例
2018/04/25 Python
python 创建一个空dataframe 然后添加行数据的实例
2018/06/07 Python
Windows下python3.6.4安装教程
2018/07/31 Python
Python wxPython库Core组件BoxSizer用法示例
2018/09/03 Python
关于jupyter打开之后不能直接跳转到浏览器的解决方式
2020/04/13 Python
什么是Python变量作用域
2020/06/03 Python
如何将Pycharm中调整字体大小的方式设置为&quot;ctrl+鼠标滚轮上下滑&quot;
2020/11/17 Python
Clarks鞋澳大利亚官方网站:Clarks Australia
2019/12/25 全球购物
美国价格实惠的在线眼镜网站:Zeelool
2020/12/25 全球购物
《满井游记》教学反思
2014/02/26 职场文书
暑期培训班策划方案
2014/08/26 职场文书
党代会心得体会
2014/09/04 职场文书
雨花台导游词
2015/02/06 职场文书
上诉状格式
2015/05/23 职场文书
Oracle创建只读账号的详细步骤
2021/06/07 Oracle
关于springboot 配置date字段返回时间戳的问题
2021/07/25 Java/Android
用 Python 定义 Schema 并生成 Parquet 文件详情
2021/09/25 Python