Yii2中设置与获取别名的函数(setAlias和getAlias)用法分析


Posted in PHP onJuly 25, 2016

本文实例讲述了Yii2中设置与获取别名的函数(setAlias和getAlias)用法。分享给大家供大家参考,具体如下:

首先说说什么是别名

在Yii中有很多的路径,在开发的过程当前我们也会使用一些路径。一般来说都需要使用绝对路径,但绝对路径都很长。

所以,为了方便的使用路径,可以在Yi中i给每个路径起个名称,这个名称就是别名。

别名的格式:

别名必须以"@"字符开头,别名中还可以包含"/"。如("@www"为根别名,"@www/test"就为子别名)
别名最后的目录分隔符("\"或者"/")都将去掉(如果有的情况下)

别名的路径有以下几个格式:

目录路径或者文件的路径(`/tmp`, `/tmp/main.txt`)
URL(`http://www.yii2.com`)
另一个别名路径(`@yii/base`),这样会调用getAlias(),解析里面的别名。

设置别名:

Yii::setAlias("@www", "C:\www\");
Yii::setAlias("@data", "C:\www\data");
Yii::setAlias("@data/attach", "C:\www\data\attach\icon.png");
Yii::setAlias("@home", "www.yiifans.com\");
Yii::setAlias("@admin", "@www\admin");

设置别名的时候,如果路径里面包含别名那么会调用getAlias(),解析里面的别名。
如:别名@yii 对应的路径为/xxx/yii,那么@yii/base将会解析为/xxx/yii/base

获取别名:

获取别名路径的时候按如下顺序来:

如果别名不以"@"开头,直接返回别名,不作处理
查找相匹配的最长的别名,然后用别名路径来替换传入的参数中的别名。

如设置了两个别名"@foo"=>"my""@foo/test"=>"my/test"

如果用@foo/test/config来获取对应的路径,结果为"my/test/config"
如果用@foo/testtst/config来获取对应的路径,结果为"my/testtst/config"
如果用@foo/config来获取对应的路径,结果为"my/config"

即在匹配的时候会以"/"作为分隔符,先匹配最长的别名

上面设置的别名的结果分别为:

Yii::getAlias("@www");
//输出:C:\www
Yii::getAlias("@data");
//输出:C:\www\data
Yii::getAlias("@data/attach");
//输出:C:\www\data\attach\icon.png
Yii::getAlias("@home");
//输出:www.yiifans.com
Yii::getAlias("@admin");
//输出:C:\www\admin

设置别名函数源码:setAlias

public static function setAlias($alias, $path)
{
 if (strncmp($alias, '@', 1)) {
  //如果不是@开头,则自动在前面加上@
  $alias = '@' . $alias;
 }
 //查找别名中的"/"
 $pos = strpos($alias, '/');
 //如果别名中没有"/",则根别名就是所输入的别名,否则从截取"/"前面的作为根别名
 //如:@www,根别名就为@www;
 //如:@www/data,那么根别名截取为@www。
 $root = $pos === false ? $alias : substr($alias, 0, $pos);
 if ($path !== null) {
  /*
   * 如果路径中包含有别名,另直接调用getAlias来解析得到路径。
   * 否则去掉结尾的"/"、"\"
   */
  $path = strncmp($path, '@', 1) ? rtrim($path, '\\/') : static::getAlias($path);
  if (!isset(static::$aliases[$root])) {
   /*
    * 如果还没有设置过这个根别名(@www)
    *
    * 如果别名就是根别名(参数就是@www),则直接设置别名对应的路径(['@www'=>'路径'])
    * 否则生成路径为一个数组(['@www'=>['@www/data'=>'路径'])
    *
    * @www   ['@www'=>'xxxx']
    * @www/a   ['@www'=>['@www/a'=>xxxa]]
    * @www/b   ['@www'=>['@www/b'=>xxxb]]
    * @www/a/b   ['@www'=>['@www/a/b'=>xxxc]]
    *
    * 注:上面的这4中只会注册其中的一个,因为在上面判断了有没有注册@www
    */
   if ($pos === false) {
    static::$aliases[$root] = $path;
   } else {
    static::$aliases[$root] = [$alias => $path];
   }
  } elseif (is_string(static::$aliases[$root])) {
   /*
    * 注册过根别名(只有注册过根别名,对应的值才会是字符串)
    *
    * 如果当前注册的是根别名,直接覆盖旧值。
    * ['@www']=xxx
    *
    * 否则把当前别名和根别名添加到根别名数组中
    * @www/a  ['@www']=['@www/a'=>xxxa,'@www'=>'xxx']
    *
    */
   if ($pos === false) {
    static::$aliases[$root] = $path;
   } else {
    static::$aliases[$root] = [
     $alias => $path,
     $root => static::$aliases[$root],
    ];
   }
  } else {
   //添加到根别名的数组中
   static::$aliases[$root][$alias] = $path;
   krsort(static::$aliases[$root]);
  }
 } elseif (isset(static::$aliases[$root])) {
  //如果是根别名数组,删除子别名。
  if (is_array(static::$aliases[$root])) {
   unset(static::$aliases[$root][$alias]);
  } elseif ($pos === false) {
   //删除整个根别名数组
   unset(static::$aliases[$root]);
  }
 }
}

例如:

@www=>xxx        ['@www']=xxx
@www=>yyy        ['@www']=yyy
@www/a=>yyya      ['@www']=['@www/a'=>yyya,'@www'=>yyy]
@www/b=yyyb       ['@www']=['@www/a'=>yyya,'@www'=>yyy,'@www/b'=>yyyb]

也就是说,会把所有的相同根别名的数据,放到一个以根别名为键的数组中,而且对键进行逆向排序

获取别名函数源码:getAlias

public static function getAlias($alias, $throwException = true)
{
 //如果不是为@开头,直接返回alias
 if (strncmp($alias, '@', 1)) {
  // not an alias
  return $alias;
 }
 //获取根别名,和setAlias相同
 $pos = strpos($alias, '/');
 $root = $pos === false ? $alias : substr($alias, 0, $pos);
 if (isset(static::$aliases[$root])) {
  //如果根别名的值为字符串,即只设置了一个根别名(['@www'=>xxx])
  if (is_string(static::$aliases[$root])) {
   /*
    * 如果获取的名称为根别名,直接返回根别名对应的路径,
    * 否则返回值为根别名路径+去掉别名之后的路径
    *
    * 如:
    * @www,直接返回 xxx
    * @www/aaa/bbb 返回xxx/aaa/bbb
    */
   return $pos === false ? static::$aliases[$root] : static::$aliases[$root] . substr($alias, $pos);
  } else {
   /* 遍历子别名
    *
    * @www=>xxx  ['@www']=xxx
    * @www=>yyy  ['@www']=yyy
    * @www/a=>yyya  ['@www']=['@www/a'=>yyya,'@www'=>yyy]
    * @www/b=>yyyb  ['@www']=['@www/a'=>yyya,'@www/b'=>yyyb,'@www'=>yyy]
    * @www/a/c=>yyyac  ['@www']=['@www/a/c'=>yyyac,'@www/a'=>yyya,'@www/b'=>yyyb,'@www'=>yyy]
    */
   foreach (static::$aliases[$root] as $name => $path) {
    /*
     * 在这里,因为根别名的所有子别名都根据键也就是子别名进行了逆向排序
     * 所以在查找的时候总是先匹配最长的别名。
     *
     * 又因为在比较的时候给别名后面加了"/",所以可以保证在查找的时候能以"/"作为分隔符。
     */
    if (strpos($alias . '/', $name . '/') === 0) {
     return $path . substr($alias, strlen($name));
    }
   }
  }
 }
 if ($throwException) {
  throw new InvalidParamException("Invalid path alias: $alias");
 } else {
  return false;
 }
}

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

PHP 相关文章推荐
无数据库的详细域名查询程序PHP版(2)
Oct 09 PHP
php过滤危险html代码
Aug 18 PHP
php 随机记录mysql rand()造成CPU 100%的解决办法
May 18 PHP
php Smarty初体验二 获取配置信息
Aug 08 PHP
php调整gif动画图片尺寸示例代码分享
Dec 05 PHP
PHP字符串中特殊符号的过滤方法介绍
Feb 18 PHP
WordPress中使主题支持小工具以及添加插件启用函数
Dec 22 PHP
PHP中的表达式简述
May 29 PHP
PHP实现的简单异常处理类示例
May 04 PHP
详解Yii2 之 生成 URL 的方法
Jun 16 PHP
PHP简单实现记录网站访问量功能示例
Jun 06 PHP
php实现登录页面的简单实例
Sep 29 PHP
详解PHP实现定时任务的五种方法
Jul 25 #PHP
Yii2中YiiBase自动加载类、引用文件方法分析(autoload)
Jul 25 #PHP
PHP中session跨子域的三种实现方法
Jul 25 #PHP
Yii2创建控制器(createController)方法详解
Jul 23 #PHP
Yii2主题(Theme)用法详解
Jul 23 #PHP
Yii2创建表单(ActiveForm)方法详解
Jul 23 #PHP
Yii2验证器(Validator)用法分析
Jul 23 #PHP
You might like
PHP实现用户认证及管理完全源码
2007/03/11 PHP
JS与PHP向函数传递可变参数的区别实例代码
2011/05/18 PHP
PHP文件缓存类实现代码
2015/10/26 PHP
Symfony2中被遗弃的getRequest()方法分析
2016/03/17 PHP
非常有用的9个PHP代码片段
2016/04/06 PHP
Laravel ORM 数据model操作教程
2019/10/21 PHP
张孝祥JavaScript学习阶段性总结(2)--(X)HTML学习
2007/02/03 Javascript
javascript flash下fromCharCode和charCodeAt方法使用说明
2008/01/12 Javascript
juqery 学习之五 文档处理 包裹、替换、删除、复制
2011/02/11 Javascript
《JavaScript高级程序设计》阅读笔记(一) ECMAScript基础
2012/02/27 Javascript
JS获取下拉列表所选中的TEXT和Value的实现代码
2014/01/11 Javascript
JavaScript获取XML数据附示例截图
2014/03/05 Javascript
jquery $.trim()方法使用介绍
2014/05/21 Javascript
JavaScript中使用arguments获得函数传参个数实例
2014/08/27 Javascript
jQuery幻灯片带缩略图轮播效果代码分享
2015/08/17 Javascript
Bootstrap表单组件教程详解
2016/04/26 Javascript
jquery插件uploadify多图上传功能实现代码
2016/08/12 Javascript
利用js实现前后台传送Json的示例代码
2018/03/29 Javascript
在axios中使用params传参的时候传入数组的方法
2018/09/25 Javascript
微信小程序实现底部弹出模态框
2020/11/18 Javascript
Python PyInstaller安装和使用教程详解
2020/01/08 Python
Python warning警告出现的原因及忽略方法
2020/01/31 Python
解决tensorboard多个events文件显示紊乱的问题
2020/02/15 Python
tensorflow pb to tflite 精度下降详解
2020/05/25 Python
Python如何读写二进制数组数据
2020/08/01 Python
CSS3 渐变(Gradients)之CSS3 线性渐变
2016/07/08 HTML / CSS
Html5嵌入钉钉的实现示例
2020/06/04 HTML / CSS
澳洲的服装老品牌:SABA
2018/02/06 全球购物
美国正宗奢华复古手袋、珠宝及配饰网站:What Goes Around Comes Around
2018/07/21 全球购物
财务工作犯错检讨书
2014/10/07 职场文书
2014年度工作总结报告
2014/12/15 职场文书
2015年人事专员工作总结
2015/04/29 职场文书
2015年语文教研组工作总结
2015/05/23 职场文书
2015年暑期社会实践总结
2015/07/13 职场文书
Python实现为PDF去除水印的示例代码
2022/04/03 Python
MYSQL中文乱码问题的解决方案
2022/06/14 MySQL