浅谈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 相关文章推荐
如何开发一个虚拟域名系统
Oct 09 PHP
elgg 获取文件图标地址的方法
Mar 20 PHP
php 上一篇,下一篇文章实现代码与原理说明
May 09 PHP
coreseek 搜索英文的问题详解
Jun 08 PHP
利用curl 多线程 模拟 并发的详解
Jun 14 PHP
php中通过curl检测页面是否被百度收录
Sep 27 PHP
图解找出PHP配置文件php.ini的路径的方法
Aug 20 PHP
PHP中使用php://input处理相同name值的表单数据
Feb 03 PHP
PHP之密码加密的几种方式
Jul 29 PHP
Laravel5.* 打印出执行的sql语句的方法
Jul 24 PHP
PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
Nov 14 PHP
PHP 图片合成、仿微信群头像的方法示例
Oct 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
Apache 配置详解(最好的APACHE配置教程)
2010/07/04 PHP
destoon二次开发入门示例
2014/06/20 PHP
如何使用纯PHP实现定时器任务(Timer)
2015/07/31 PHP
PHP经典实用正则表达式小结
2017/05/04 PHP
php实现文件预览功能
2017/05/23 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
2017/11/14 PHP
JS 字符串连接[性能比较]
2009/05/10 Javascript
HTML颜色选择器实现代码
2010/11/23 Javascript
JavaScript中圆括号()和方括号[]的特殊用法疑问解答
2013/08/06 Javascript
jquery利用ajax调用后台方法实例
2013/08/23 Javascript
js实现目录定位正文示例
2013/11/14 Javascript
js获取光标位置和设置文本框光标位置示例代码
2014/01/09 Javascript
javascript记住用户名和登录密码(两种方式)
2015/08/04 Javascript
jQuery实现类似标签风格的导航菜单效果代码
2015/08/25 Javascript
跟我学习javascript的垃圾回收机制与内存管理
2015/11/23 Javascript
分享使用AngularJS创建应用的5个框架
2015/12/05 Javascript
jquery获取img的src值的简单实例
2016/05/17 Javascript
完美实现八种js焦点轮播图(下篇)
2020/04/20 Javascript
JS实现页面数据无限加载
2016/09/13 Javascript
jquery.validate[.unobtrusive]和Bootstrap实现tooltip错误提示问题分析
2016/10/30 Javascript
手写简单的jQuery雪花飘落效果实例
2018/04/22 jQuery
Vue+webpack项目配置便于维护的目录结构教程详解
2018/10/14 Javascript
Vue.js中的extend绑定节点并显示的方法
2019/06/20 Javascript
浅析微信小程序modal弹窗关闭默认会执行cancel问题
2019/10/14 Javascript
[51:07]VGJ.S vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
2014/06/10 Python
Python简单检测文本类型的2种方法【基于文件头及cchardet库】
2016/09/18 Python
python验证码识别教程之滑动验证码
2018/06/04 Python
伯利陶器:Burleigh Pottery
2018/01/03 全球购物
英国异国风情旅游网站:Travel Talk Tours(团体旅游、探险旅游、帆船假期)
2018/07/26 全球购物
澳大利亚婴儿礼品公司:The Baby Gift Company
2018/11/04 全球购物
毕业生优秀推荐信
2013/11/26 职场文书
会计学自我鉴定
2014/02/06 职场文书
老同学聚会感言
2014/02/23 职场文书
2014年教研工作总结
2014/12/06 职场文书
检讨书范文2000字
2015/01/28 职场文书