浅谈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 相关文章推荐
支持oicq头像的留言簿(二)
Oct 09 PHP
php获得文件扩展名三法
Nov 25 PHP
phpfans留言版用到的数据操作类和分页类
Jan 04 PHP
PHP查询MySQL大量数据的时候内存占用分析
Jul 22 PHP
浅析php学习的路线图
Jul 10 PHP
PHP获取浏览器信息类和客户端地理位置的2个方法
Apr 24 PHP
PHP的反射类ReflectionClass、ReflectionMethod使用实例
Aug 05 PHP
Laravel 5框架学习之Eloquent (laravel 的ORM)
Apr 08 PHP
php获取指定范围内最接近数的方法
Jun 02 PHP
PHP清除缓存的几种方法总结
Sep 12 PHP
thinkphp5使用无限极分类
Feb 18 PHP
php7 错误处理机制修改实例分析
May 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
从康盛产品(discuz)提取出来的模板类
2011/06/28 PHP
PHP+Ajax实现的无刷新分页功能详解【附demo源码下载】
2017/07/03 PHP
PHP针对伪静态的注入总结【附asp与Python相关代码】
2017/08/01 PHP
百度留言本js 大家可以参考下
2009/10/13 Javascript
jquery 元素相对定位代码
2010/10/15 Javascript
微博@符号的用户名提示效果。(想@到谁?)
2010/11/05 Javascript
javascript中关于break,continue的特殊用法与介绍
2012/05/24 Javascript
javascript full screen 全屏显示页面元素的方法
2013/09/27 Javascript
js中for in的用法示例解析
2013/12/25 Javascript
jQuery中:visible选择器用法实例
2014/12/30 Javascript
JS实现兼容性好,自动置顶的淘宝悬浮工具栏效果
2015/09/18 Javascript
jQuery实现批量判断表单中文本框非空的方法(2种方法)
2015/12/09 Javascript
Vue.js教程之axios与网络传输的学习实践
2017/04/29 Javascript
详解vue服务端渲染(SSR)初探
2017/06/19 Javascript
node中的cookie的具体使用
2018/09/13 Javascript
js canvas实现橡皮擦效果
2018/12/20 Javascript
怎么使用javascript深度拷贝一个数组
2019/06/06 Javascript
js实现3D旋转效果
2020/08/18 Javascript
js轮播图之旋转木马效果
2020/10/13 Javascript
[01:00:14]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第二场 2月28日
2021/03/11 DOTA
web.py在模板中输出美元符号的方法
2014/08/26 Python
Python中正则表达式详解
2017/05/17 Python
python实现mysql的读写分离及负载均衡
2018/02/04 Python
Python实现合并两个有序链表的方法示例
2019/01/31 Python
Python如何基于selenium实现自动登录博客园
2019/12/16 Python
星空联盟C# .net笔试题
2014/12/05 面试题
新闻编辑自荐信
2013/11/03 职场文书
师德个人剖析材料
2014/02/02 职场文书
人力资源作业细则
2014/03/03 职场文书
企业职业病防治方案
2014/05/29 职场文书
个人对照检查材料思想汇报(四风问题)
2014/09/25 职场文书
运动员入场词
2015/07/18 职场文书
优秀团员主要事迹范文
2015/11/05 职场文书
创业计划书之外语培训班
2019/11/02 职场文书
css3 实现文字闪烁效果的三种方式示例代码
2021/04/25 HTML / CSS
笔记本自带的win11如何跳过联网激活?
2022/04/20 数码科技