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中使用XML
Oct 09 PHP
一步一步学习PHP(4) php 函数 补充2
Feb 15 PHP
Discuz Uchome ajaxpost小技巧
Jan 04 PHP
php在线代理转向代码
May 05 PHP
PHPEXCEL 使用小记
Jan 06 PHP
编译php 5.2.14+fpm+memcached(具体操作详解)
Jun 18 PHP
php以fastCGI的方式运行时文件系统权限问题及解决方法
May 11 PHP
解决php的“It is not safe to rely on the system’s timezone settings”问题
Oct 08 PHP
Zend Framework基于Command命令行建立ZF项目的方法
Feb 18 PHP
Laravel使用PHPQRCODE实现生成带有LOGO的二维码图片功能示例
Jul 07 PHP
php让json_encode不自动转义斜杠“/”的方法
Apr 27 PHP
如何使用php生成zip压缩包
Apr 21 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中通过ADODB库实现调用Access数据库之修正版本
2006/12/31 PHP
Discuz! Passport 通行证整合
2008/03/27 PHP
PHP连接和操作MySQL数据库基础教程
2014/09/29 PHP
Thinkphp 框架扩展之数据库驱动常用方法小结
2020/04/23 PHP
fix-ie5.js扩展在IE5下不能使用的几个方法
2007/08/20 Javascript
jquery 获取json数据实现代码
2009/04/27 Javascript
jqPlot Option配置对象详解
2009/07/25 Javascript
面向对象设计模式的核心法则
2013/11/10 Javascript
24款热门实用的jQuery插件推荐
2014/12/24 Javascript
JavaScript 学习笔记之语句
2015/01/14 Javascript
JS判断元素是否在数组内的实现代码
2016/03/30 Javascript
漫谈JS引擎的运行机制 你应该知道什么
2016/06/15 Javascript
js 函数式编程学习笔记
2017/03/25 Javascript
JS基于正则表达式的替换操作(replace)用法示例
2017/04/28 Javascript
Vue2.0 从零开始_环境搭建操作步骤
2017/06/14 Javascript
微信小程序实现列表下拉刷新上拉加载
2020/07/29 Javascript
node.js ws模块搭建websocket服务端的方法示例
2019/04/25 Javascript
Vue 3.0 前瞻Vue Function API新特性体验
2019/08/12 Javascript
原生js基于canvas实现一个简单的前端截图工具代码实例
2019/09/10 Javascript
vue实现将一个数组内的相同数据进行合并
2019/11/07 Javascript
vue实现井字棋游戏
2020/09/29 Javascript
如何手动实现一个 JavaScript 模块执行器
2020/10/16 Javascript
JS相册图片抖动放大展示效果的示例代码
2021/01/29 Javascript
python判断字符串是否纯数字的方法
2014/11/19 Python
总结python爬虫抓站的实用技巧
2016/08/09 Python
Python3实现对列表按元组指定列进行排序的方法分析
2018/12/22 Python
python 同时运行多个程序的实例
2019/01/07 Python
Django搭建项目实战与避坑细节详解
2020/12/06 Python
HTML5 drag和drop具体使用详解
2021/01/18 HTML / CSS
jurlique茱莉蔻英国官网:澳洲天然护肤品
2018/08/03 全球购物
BAILEY 44官网:美国制造的女性服装
2019/07/01 全球购物
俄罗斯在线大型超市:ТутПросто
2021/01/08 全球购物
联想智利官方网站:Lenovo Chile
2020/06/03 全球购物
继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么?
2015/11/18 面试题
《学会待客》教学反思
2014/02/22 职场文书
mysql在项目中怎么选事务隔离级别
2021/05/25 MySQL