首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

Smarty 模板中直接调用 PHP 内置函数与自定义函数完全指南

     編輯:PHP 綜合知識

打破模板限制:Smarty 中的 PHP 函数调用技巧

Smarty 设计初衷是分离业务逻辑与展示逻辑,但实际开发中偶尔需要在模板中直接使用 PHP 函数。本文系统梳理 Smarty 调用 PHP 内置函数、修饰符语法、数组处理特殊语法及自定义函数注册的完整用法。

一、基础语法:管道修饰符调用

Smarty 使用 | 管道符调用修饰符,本质上映射为 PHP 函数调用:

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

等同于 PHP:

echo functionName('param1', 'param2', 'param3');

常见示例

{* 字符串截取 *}
{'1234567'|substr:'1':'2'}  {* 输出: 23 *}

{* 字符串替换,注意参数顺序 *}
{'a'|str_replace:'A':'abcd'}  {* 输出: Abcd *}

二、数组操作的特殊语法:@ 符号

当对数组调用 count、end 等函数时,直接使用 {$arr|count} 会返回字符串 "Array" 而非长度。需加 @ 前缀:

{* 正确获取数组长度 *}
{$arr|@count}

{* 获取数组最后一个元素 *}
{$arr|@end}

原理说明

Smarty 解析修饰符时,检测到 @ 前缀会将数组作为整体传递给函数,而非遍历数组元素逐个调用。测试结论:

  • 数组类型函数(count, end, reset 等)必须加 @
  • 字符串函数(strlen, strtoupper 等)加不加 @ 均可

三、注册自定义函数

复杂逻辑建议封装为自定义函数并注册,而非在模板中拼接多个修饰符。

步骤 1:编写 PHP 函数

<?php
/**
 * 中英文混合字符串截取(按字符数而非字节数)
 * @param array $params 包含 text, length 键
 * @return string
 */
function SmartyLen($params) {
    extract($params); // 导入 text, length 变量
    $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;
}
?>

步骤 2:注册函数

$smarty->register_function('len', "SmartyLen");

步骤 3:模板调用

{len text="测试内容" length="10"}

注意:参数名必须与函数内 extract($params) 期望的变量名一致。

四、最佳实践建议

  1. 克制使用:模板中调用复杂 PHP 函数违背分层原则,优先在控制器预处理数据
  2. 安全过滤:用户输入数据经模板函数处理时,确保已转义防止 XSS
  3. 性能考量:频繁调用的修饰符可编译为 PHP 原生函数,避免反射开销

五、版本差异提示

Smarty 3.x 对比 2.x 增强了 registerPlugin 统一注册接口,推荐使用:

$smarty->registerPlugin('function', 'len', 'SmartyLen');
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved