溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么在smarty中調(diào)用php內(nèi)置函數(shù)

發(fā)布時(shí)間:2020-12-30 15:19:35 來源:億速云 閱讀:195 作者:Leah 欄目:開發(fā)技術(shù)

今天就跟大家聊聊有關(guān)怎么在smarty中調(diào)用php內(nèi)置函數(shù),可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

模板書寫: 

{'param1'|functionName:'param2':'param3'}

php函數(shù)原型:
echo functionName('param1','param2','param3');
實(shí)例:
{'1234567'|substr:'1':'2'}

下面這個(gè)和函數(shù)的參數(shù)順序有關(guān)系

{'a'|str_replace:'A':'abcd'}

直接延伸到,直接在php中寫一個(gè)函數(shù)調(diào)用,不需要注冊修改器的.

更深一步的研究:發(fā)現(xiàn)數(shù)組會出錯(cuò).

分配了一個(gè)數(shù)組array給Smarty,假設(shè)Smarty的分界符為'{' 和'}'。

在很多資料上都看到,在Smarty中要求數(shù)組的長度時(shí),可以用在數(shù)組后便加|count的方法調(diào)用。即通過{array|count}獲得 array的長度。但是今天在寫模板時(shí),發(fā)現(xiàn)這樣得不到數(shù)組的長度,而只是得到一個(gè)返回的字符串Array。也就是說僅僅是返回了{(lán)array}的結(jié)果, 而沒有返回其array的長度。
查看smarty\plugins文件夾,發(fā)現(xiàn)并沒有count的相關(guān)方法,也就是說,count是直接調(diào)用了php中的方法。

后來通過網(wǎng)絡(luò)上的資料,發(fā)現(xiàn)可以在count前面加@,從而正確的獲取數(shù)組的長度。再進(jìn)一步查看Smarty的源碼,發(fā)現(xiàn)Smarty對屬性調(diào)節(jié)器后邊的 方法名進(jìn)行處理時(shí),會對前邊加@的進(jìn)行特殊處理。因此作出判斷:在Smarty中的屬性調(diào)節(jié)器中調(diào)用php中定義好的函數(shù)時(shí),可以通過加@來表示。
1、對類型為數(shù)組的方法進(jìn)行測試時(shí),發(fā)現(xiàn)不加@符號都會出錯(cuò)。比如:要對一個(gè)數(shù)組調(diào)用count方法求出數(shù)組的長度,就可以這樣調(diào)用{array|@count},而要對數(shù)組調(diào)用end方法得出數(shù)組的最后一組數(shù)據(jù)時(shí),則可以通過{array|@end}。
2、在對字符串的相關(guān)函數(shù)進(jìn)行測試,發(fā)現(xiàn)加不加@都可以正常的調(diào)用。
3、其他的尚未認(rèn)真測試。

對于在smarty中調(diào)用復(fù)雜的php函數(shù)不予鼓勵(lì),因?yàn)镾marty的本意就是要實(shí)現(xiàn)代碼和模板分離,不要偏離了人家的設(shè)計(jì)初衷。

模板書寫:
{'param1'|functionName:'param2':'param3'}

php函數(shù)原型:
echo functionName('param1','param2','param3');

實(shí)例:
{'1234567'|substr:'1':'2'}
下面這個(gè)比較怪 和函數(shù)的參數(shù)順序有關(guān)系
{'a'|str_replace:'A':'abcd'}

Smarty調(diào)用自定義函數(shù)
調(diào)用自定義函數(shù)需要用到register_function() 來注冊
這里為大家舉個(gè)例子,常見的字符串切割

函數(shù)如下

復(fù)制代碼 代碼如下:


<?php
function SmartyLen($params){
extract($params);
$len=strlen($text);
$max=$length;
for   ($i=0;$i<$length;$i++){
           $chr=substr($text,$i,1);
           if(ord($chr)>0x80)//字符是中文
           {
               $length++;
               $i++;
      $len--;
            }
}
$str=substr($text,0,$length);
if($len>$max)$str.="...";
Return $str;
}

注冊函數(shù)
$smarty->register_function('len',"SmartyLen");

模板調(diào)用
{len text="測試下" length="1"} //注意這里的text和length其實(shí)是函數(shù)里的2個(gè)參數(shù)函數(shù)的參數(shù)必須要以函數(shù)內(nèi)部變量名一致,其實(shí)傳回去的的是個(gè)數(shù)組,在函數(shù)里用extract($params);把數(shù)組中的變量導(dǎo)入到當(dāng)前的符號表。

看完上述內(nèi)容,你們對怎么在smarty中調(diào)用php內(nèi)置函數(shù)有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI