国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

Yii2中設置與獲取別名的函數(setAlias和getAlias)用法分析

2024-05-04 23:48:48
字體:
來源:轉載
供稿:網友

本文實例講述了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:/wwwYii::getAlias("@data");//輸出:C:/www/dataYii::getAlias("@data/attach");//輸出:C:/www/data/attach/icon.pngYii::getAlias("@home");//輸出:www.yiifans.comYii::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教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 樟树市| 巴马| 横山县| 武汉市| 九台市| 门源| 长治市| 南平市| 射洪县| 汉源县| 麻城市| 绥阳县| 平舆县| 微山县| 壶关县| 普安县| 都兰县| 武夷山市| 岳普湖县| 三原县| 长泰县| 陆丰市| 平罗县| 德化县| 同仁县| 凌源市| 漳平市| 龙口市| 绥宁县| 黑龙江省| 和静县| 昔阳县| 鸡泽县| 房山区| 北京市| 阳山县| 三河市| 治县。| 迁西县| 于都县| 大足县|