浅谈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 相关文章推荐
在Windows系统上安装PHP运行环境文字教程
Jul 19 PHP
php学习笔记 面向对象的构造与析构方法
Jun 13 PHP
php无限分类且支持输出树状图的详细介绍
Jun 19 PHP
PHP删除数组中空值的方法介绍
Apr 14 PHP
浅析php适配器模式(Adapter)
Nov 25 PHP
php批量添加数据与批量更新数据的实现方法
Dec 16 PHP
php解析http获取的json字符串变量总是空白null
Mar 02 PHP
PHP中curl_setopt函数用法实例分析
Apr 16 PHP
php+MySQL实现登录时验证登录名和密码是否正确
May 10 PHP
对比PHP对MySQL的缓冲查询和无缓冲查询
Jul 01 PHP
php mysql_real_escape_string addslashes及mysql绑定参数防SQL注入攻击
Dec 23 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
Mar 02 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/11/15 PHP
使用PHP强制下载PDF文件示例
2014/01/17 PHP
php制作基于xml的RSS订阅源功能示例
2017/02/08 PHP
thinkphp5实现微信扫码支付
2019/12/23 PHP
Cookie 注入是怎样产生的
2009/04/08 Javascript
javascript中的107个基础知识收集整理 推荐
2010/03/29 Javascript
基于JQuery的cookie插件
2010/04/07 Javascript
33个优秀的 jQuery 图片展示插件分享
2012/03/14 Javascript
Jquery显示和隐藏元素或设为只读(含Ligerui的控件禁用,实例说明介绍)
2013/07/09 Javascript
详解AngularJS的通信机制
2015/06/18 Javascript
JavaScript必知必会(七)js对象继承
2016/06/08 Javascript
jQuery实现的纵向下拉菜单实例详解【附demo源码下载】
2016/07/09 Javascript
微信小程序 利用css实现遮罩效果实例详解
2017/01/21 Javascript
angular学习之ngRoute路由机制
2017/04/12 Javascript
Vuejs 页面的区域化与组件封装的实现
2017/09/11 Javascript
vue2.0实现音乐/视频播放进度条组件
2018/06/06 Javascript
微信小程序学习总结(三)条件、模板、文件引用实例分析
2020/06/04 Javascript
js对象属性名驼峰式转下划线的实例代码
2020/09/17 Javascript
Vue指令实现OutClick的示例
2020/11/16 Javascript
总结网络IO模型与select模型的Python实例讲解
2016/06/27 Python
Python如何实现MySQL实例初始化详解
2017/11/06 Python
Python3中条件控制、循环与函数的简易教程
2017/11/21 Python
Python Pexpect库的简单使用方法
2019/01/29 Python
Python安装与基本数据类型教程详解
2019/05/29 Python
django自带调试服务器的使用详解
2019/08/29 Python
tensorflow使用L2 regularization正则化修正overfitting过拟合方式
2020/05/22 Python
Original Penguin英国官方网站:美国著名休闲时装品牌
2016/10/30 全球购物
大学生职业生涯规划书前言
2014/01/09 职场文书
超市5.1促销活动
2014/01/15 职场文书
银行实习推荐信
2015/03/27 职场文书
小兵张嘎电影观后感
2015/06/03 职场文书
结婚典礼致辞
2015/07/28 职场文书
2016新党章学习心得体会
2016/01/15 职场文书
golang interface判断为空nil的实现代码
2021/04/24 Golang
MySQL优化之如何写出高质量sql语句
2021/05/17 MySQL
node.js使用express-fileupload中间件实现文件上传
2021/07/16 Javascript