THINKPHP5 volist標簽循環不能設置循環變量為$i


在thinkphp5的volist標簽中不要用$i作為id,舉個簡單例子

控制器這樣寫

模板這樣寫

結果是

這很令人費解啊。然后換一個循環變量看看

 

循環正常了,看來這個id這里設置循環變量的時候 不能設置為i。翻看手冊 發現有一條

這說明了key屬性默認是i,這樣一來沖突了,出現了覆蓋,就出現了奇怪現象,最后一個單詞總是比實際的后移了一位ascii碼 比如 php變為了phq,mysql變為了mysqm,linux變為了linuy,都是差一位,這真是一個奇怪的現象啊

 然后我看了一下框架解析標簽后的代碼,在runtime/tmp里面

找到了代碼

<?php if(is_array($list) || $list instanceof \think\Collection || $list instanceof \think\Paginator): $i = 0; $__LIST__ = $list;if( count($__LIST__)==0 ) : echo "" ;else: foreach($__LIST__ as $key=>$i): $mod = ($i % 2 );++$i;?>
<?php echo $i; ?><br/>
<?php endforeach; endif; else: echo "" ;endif; ?>

這代碼不太好理解,我刪掉了部分,得到如下

<?php if(is_array($list): $i = 0; $__LIST__ = $list;if( count($__LIST__)==0 ) : echo "" ;else: foreach($__LIST__ as $key=>$i): $mod = ($i % 2 );++$i;?>
<?php echo $i; ?><br/>
<?php endforeach; endif; else: echo "" ;endif; ?>

這是用的PHP的原始的foreach和if的標簽,我更改一下這個標簽就變為

<?php 
if(is_array($list)
{
    $i = 0; 
    $__LIST__ = $list;
    if( count($__LIST__)==0 )
    {
        echo "" ;
    }else{
        foreach($__LIST__ as $key=>$i)
        {
            $mod = ($i % 2 );++$i;
            echo $i;
            ?>
            <br/>
        <?php 
        } 
    }else
    { 
        echo "" ;
    }
}
?>

我們可以看到,主要是foreach循環這一步,簡化一下,由於 $list賦值給$__LIST__然后用$__LIST__循環出來的,所以可以直接簡化為

從這里我們看到了,循環之后 $mod幾乎沒起到什么作用,然后就++$i然后輸出$i,我們直接做測試看看

果然我們復現了問題,其實就是每個循環的游標變量都自增了一下,然后被輸出,這就是為什么 php變為了phq,mysql變為了mysqm,linux變為了linuy,原來如此啊,看來我們不能大意,不要隨便給volist標簽中的id賦值為i啊!

現在我們可以指明這個游標變量的名字看看

果然解析后的代碼如下

看到了吧,這樣就不會游標元素值就不會自增了,而是索引自增。

這回是徹底搞明白了,哈哈哈


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM