浅谈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 相关文章推荐
LotusPhp笔记之:Logger组件的使用方法
May 06 PHP
基于xcache的配置与使用详解
Jun 18 PHP
基于simple_html_dom的使用小结
Jul 01 PHP
PHP之密码加密的几种方式
Jul 29 PHP
php有效防止图片盗用、盗链的两种方法
Nov 01 PHP
laravel 5.1下php artisan migrate的使用注意事项总结
Jun 07 PHP
laravel项目利用twemproxy部署redis集群的完整步骤
May 11 PHP
PHP智能识别收货地址信息实例
Jan 05 PHP
PHP商品秒杀问题解决方案实例详解【mysql与redis】
Jul 22 PHP
Laravel手动返回错误码示例
Oct 22 PHP
ThinkPHP5.1+Ajax实现的无刷新分页功能示例
Feb 10 PHP
php-7.3.6 编译安装过程
Feb 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
ezSQL PHP数据库操作类库
2010/05/16 PHP
PHP计数器的实现代码
2013/06/08 PHP
Codeigniter购物车类不能添加中文的解决方法
2014/11/29 PHP
php获取字符串中各个字符出现次数的方法
2015/02/23 PHP
php中通过DirectoryIterator删除整个目录的方法
2015/03/13 PHP
php简单防盗链实现方法
2015/07/29 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
2020/03/24 PHP
JavaScript在IE中“意外地调用了方法或属性访问”
2008/11/19 Javascript
js禁止页面使用右键(简单示例代码)
2013/11/13 Javascript
为Javascript中的String对象添加去除左右空格的方法(示例代码)
2013/11/30 Javascript
JS控制图片等比例缩放的示例代码
2013/12/24 Javascript
javascript的数组和常用函数详解
2014/05/09 Javascript
Nodejs Post请求报socket hang up错误的解决办法
2014/09/25 NodeJs
浅谈javascript回调函数
2014/12/07 Javascript
node.js中的console.trace方法使用说明
2014/12/09 Javascript
AngularJS Bootstrap详细介绍及实例代码
2016/07/28 Javascript
滚动条的监听与内容随着滚动条动态加载的实现
2017/02/08 Javascript
浅谈javascript如何获取文件后缀名
2020/08/07 Javascript
JS数组索引检测中的数据类型问题详解
2021/01/11 Javascript
c++生成dll使用python调用dll的方法
2014/01/20 Python
浅析Python中的序列化存储的方法
2015/04/28 Python
Python入门之三角函数tan()函数实例详解
2017/11/08 Python
Python实现桶排序与快速排序算法结合应用示例
2017/11/22 Python
为什么入门大数据选择Python而不是Java?
2018/03/07 Python
python实现机器学习之元线性回归
2018/09/06 Python
Python面向对象之Web静态服务器
2019/09/03 Python
tensorflow之获取tensor的shape作为max_pool的ksize实例
2020/01/04 Python
Python如何创建装饰器时保留函数元信息
2020/08/07 Python
python3.7 openpyxl 在excel单元格中写入数据实例
2020/09/01 Python
浅谈HTML5新增及移除的元素
2016/06/27 HTML / CSS
瑞典时尚服装购物网站:Miinto.se
2017/10/30 全球购物
澳大利亚墨水站Ink Station:墨水和碳粉打印机墨盒
2019/03/24 全球购物
英语演讲稿3分钟
2014/04/29 职场文书
合作协议书范本
2014/10/25 职场文书
关于倡议书的范文
2015/04/29 职场文书
vue.js Router中嵌套路由的实用示例
2021/06/27 Vue.js