浅谈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 相关文章推荐
也谈 PHP 和 MYSQL
Oct 09 PHP
PHP 中执行排序与 MySQL 中排序
Apr 21 PHP
基于MySQL体系结构的分析
May 02 PHP
web server使用php生成web页面的三种方法总结
Oct 28 PHP
递归删除一个节点以及该节点下的所有节点示例
Mar 19 PHP
编译PHP报错configure error Cannot find libmysqlclient under usr的解决方法
Jun 27 PHP
php强大的时间转换函数strtotime
Feb 18 PHP
PHP使用curl模拟post上传及接收文件的方法
Mar 04 PHP
CI框架入门之MVC简单示例
Nov 21 PHP
php 数据结构之链表队列
Oct 17 PHP
php 可变函数使用小结
Jun 12 PHP
PHP+Mysql分布式事务与解决方案深入理解
Feb 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
PHP 截取字符串函数整理(支持gb2312和utf-8)
2010/02/16 PHP
PHP和.net中des加解密的实现方法
2013/02/27 PHP
PHP的反射类ReflectionClass、ReflectionMethod使用实例
2014/08/05 PHP
PHP之autoload运行机制实例分析
2014/08/28 PHP
老生常谈PHP中的数据结构:DS扩展
2017/07/17 PHP
PHP实现的服务器一致性hash分布算法示例
2018/08/09 PHP
对字符串进行HTML编码和解码的JavaScript函数
2010/02/01 Javascript
jQuery源码分析-01总体架构分析
2011/11/14 Javascript
js中回调函数的学习笔记
2014/07/31 Javascript
JavaScript中的alert()函数使用技巧详解
2014/12/29 Javascript
jQuery实现Div拖动+键盘控制综合效果的方法
2015/03/10 Javascript
JavaScript获取DOM元素的11种方法总结
2015/04/25 Javascript
谈谈JavaScript类型系统之Math
2016/01/06 Javascript
jQuery中inArray方法注意事项分析
2016/01/25 Javascript
基于jQuery实现仿51job城市选择功能实例代码
2016/03/02 Javascript
Angular ng-class详解及实例代码
2016/09/19 Javascript
React-redux实现小案例(todolist)的过程
2019/09/29 Javascript
JS简单表单验证功能完整示例
2020/01/26 Javascript
Postman动态获取返回值过程详解
2020/06/30 Javascript
python+mysql实现简单的web程序
2014/09/11 Python
Python的Flask框架及Nginx实现静态文件访问限制功能
2016/06/27 Python
Python生成一个迭代器的实操方法
2019/06/18 Python
HUGO BOSS美国官方网上商店:世界知名奢侈品牌
2017/08/04 全球购物
经典c++面试题三
2015/07/08 面试题
行政助理岗位职责范文
2013/12/03 职场文书
省级优秀毕业生主要事迹
2014/05/29 职场文书
2014年小学国庆节活动方案
2014/09/16 职场文书
教师查摆问题自查报告
2014/10/11 职场文书
个人房屋转让协议书范本
2014/10/26 职场文书
工厂清洁工岗位职责
2015/02/14 职场文书
毕业生就业推荐表自我评价
2015/03/02 职场文书
党小组考察意见
2015/06/02 职场文书
上级领导检查欢迎词
2015/09/30 职场文书
Vue-Element-Admin集成自己的接口实现登录跳转
2021/06/23 Vue.js
Python用any()函数检查字符串中的字母以及如何使用all()函数
2022/04/14 Python
zabbix配置nginx监控的实现
2022/05/25 Servers