浅谈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 相关文章推荐
增加反向链接的101个方法 站长推荐
Jan 31 PHP
PHP安全防范技巧分享
Nov 03 PHP
php+highchats生成动态统计图
May 21 PHP
PHP获取MySql新增记录ID值的3种方法
Jun 24 PHP
PHP缓存集成库phpFastCache用法
Dec 15 PHP
关于PHP中Session文件过多的问题及session文件保存位置
Mar 17 PHP
PHP获取用户访问IP地址的5种方法
May 16 PHP
AES加解密在php接口请求过程中的应用示例
Oct 26 PHP
深入讲解PHP的对象注入(Object Injection)
Mar 01 PHP
PHP 7.0新增加的特性介绍
Jun 08 PHP
php设计模式之策略模式应用案例详解
Jun 17 PHP
php中数组最简单的使用方法
Dec 27 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
音乐朗读剧《MARS RED》2021年TV动画化决定!
2020/03/06 日漫
phpfans留言版用到的数据操作类和分页类
2007/01/04 PHP
php实现的递归提成方案实例
2015/11/14 PHP
PHP线程的内存回收问题
2016/07/08 PHP
javascript代码编写需要注意的7个小细节小结
2011/09/21 Javascript
回车直接实现点击某按钮的效果即触发单击事件
2014/02/27 Javascript
Javascript中call和apply函数的比较和使用实例
2015/02/03 Javascript
jquery实现可自动判断位置的弹出层效果代码
2015/10/12 Javascript
关于Bootstrap弹出框无法调用问题的解决办法
2016/03/10 Javascript
基于jquery实现智能表单验证操作
2016/05/09 Javascript
javascript之with的使用(阿里云、淘宝使用代码分析)
2016/10/11 Javascript
html判断当前页面是否在iframe中的实例
2016/11/30 Javascript
angular中的http拦截器Interceptors的实现
2017/02/21 Javascript
vue中axios处理http发送请求的示例(Post和get)
2017/10/13 Javascript
Node.js利用console输出日志文件的方法示例
2018/04/27 Javascript
vue改变对象或数组时的刷新机制的方法总结
2019/04/24 Javascript
Vue 防止短时间内连续点击后多次触发请求的操作
2020/11/11 Javascript
python通过smpt发送邮件的方法
2015/04/30 Python
Python向日志输出中添加上下文信息
2017/05/24 Python
Numpy 改变数组维度的几种方法小结
2018/08/02 Python
Python 仅获取响应头, 不获取实体的实例
2019/08/21 Python
解决pycharm上的jupyter notebook端口被占用问题
2019/12/17 Python
Python定时从Mysql提取数据存入Redis的实现
2020/05/03 Python
Python爬虫代理池搭建的方法步骤
2020/09/28 Python
用python进行视频剪辑
2020/11/02 Python
python 模拟登陆163邮箱
2020/12/15 Python
css3 iphone玻璃透明气泡完美实现
2013/03/20 HTML / CSS
CSS3之2D与3D变换的实现方法
2019/01/28 HTML / CSS
Steiff台湾官网:德国金耳釦泰迪熊
2019/12/26 全球购物
夜大毕业生自我评价分享
2013/11/10 职场文书
司机工作自我鉴定
2014/09/19 职场文书
购房委托书
2014/10/15 职场文书
家属慰问信
2015/02/14 职场文书
鲁滨孙漂流记读书笔记
2015/06/30 职场文书
2016年“5.12”护士节致辞
2015/07/31 职场文书
干货干货!2019最新优秀创业计划书
2019/03/21 职场文书