| Smarty2和Smarty3在實(shí)現(xiàn)上差不多,但是在smarty2升級(jí)到smarty3的時(shí)候還是要注意些許不同。 下面是已知的和smarty2不兼容的地方 ? == 語(yǔ)法 == Smarty 3 API有些方面進(jìn)行了更新。一些Smarty 2 API調(diào)用需要更新以便符合Smarty 3。你可能會(huì)得到提示,推薦你使用新的語(yǔ)法。可以查看Smarty 3附帶的 README 文件獲得更多信息。 } 語(yǔ)法總是讓人迷惑,加上@符號(hào)說(shuō)明修飾符作用于數(shù)組而不是作用于數(shù)組的每個(gè)元素。通常你總是想讓這個(gè)修飾符作用于這個(gè)變量而不必考慮它的類(lèi)型。在 Smarty 3中,{$array|mod} 和?} 是等同的。去掉@符號(hào),修飾符仍然作用于數(shù)組。如果你想修飾符作用于數(shù)據(jù)元素,你必須在模板中循環(huán)數(shù)組,或者使用自定義修飾符以支持?jǐn)?shù)組遍歷。 大多smrty函數(shù)已經(jīng)在需要的地方例如{html_options}進(jìn)行了轉(zhuǎn)義。 ? == PHP版本 == Smarty 3 僅支持PHP 5. 在PHP 4將不能正常工作。 ? == {php} 標(biāo)記 == Smarty 3 默認(rèn)關(guān)閉 {php} 標(biāo)記支持,不推薦使用。你可以通過(guò)設(shè)置$smarty->allow_php_tag=true來(lái)啟用。 {php} 塊中的變量不再與同一頁(yè)中的其它{php}塊共享作用域,因此在使用的時(shí)候要注意。 ? == 定界符和空格 == Smarty 定界符 {} 有空格包圍是不再認(rèn)為是Smarty標(biāo)記。因此,{ foo } 將被Smarty忽略,但是 {foo} 將被識(shí)別。這個(gè)變化使得 Javascript/CSS更容易在smarty中使用,而沒(méi)有必要使用 {literal}. 這個(gè)特性可以通過(guò)設(shè)置 $smarty->auto_literal = false; 禁用。 ? == 未用引號(hào)的字符串 == Smarty 2 對(duì)于參數(shù)中未用引號(hào)括起來(lái)的字符串有點(diǎn)寬容(并且模棱兩可)。Smarty 3 比較嚴(yán)格。對(duì)于不包含特殊字符(A-Za-z0-9_之外的字符)的字符串仍然可以不用引號(hào)括起來(lái)。 比如下面例子中文件名就必須用引號(hào)括起來(lái)。 ? view plain {assign?var=foo?value=baz}?<--?works?ok??{include?file="path/foo.tpl"}?<--?needs?quotes!?? ? == 擴(kuò)展Smarty類(lèi) == Smarty 3 遵循PHP5標(biāo)準(zhǔn)構(gòu)造規(guī)則。擴(kuò)展Smarty類(lèi)的時(shí)候,使用 __construct() 作為類(lèi)的構(gòu)造函數(shù)的名稱(chēng)。如果你實(shí)現(xiàn)自己的構(gòu)造函數(shù),一定要先調(diào)用 parent::__construct() ? view plain class?MySmarty?extends?Smarty?{??function?__construct()?{??parent::__construct();??//?your?initialization?code?goes?here??}??}?? ? ? == 自動(dòng)加載器 == Smarty 用spl_autoload_register函數(shù) 實(shí)現(xiàn)了它自己的自動(dòng)加載器。如果想在自己的應(yīng)用中使用自動(dòng)加載器,就必須使用此方法注冊(cè)。 使用 __autoload() 將失敗。 這是PHP5標(biāo)準(zhǔn)自動(dòng)加載函數(shù)。可以查看 http://us3.php.net/manual/en/function.spl-autoload-register.php == 插件文件名 == 自從Smarty 3使用默認(rèn)的spl自動(dòng)加載器,就要求插件文件名使用小寫(xiě)字母。Smarty 2 允許使用大小寫(xiě)混合插件名,你必須重命名以用于smarty 3. ? == Smarty特殊變量作用域 == 在Smarty 2中Smarty特殊變量 $smarty.section.* and $smarty.foreach.* 擁有全局作用域。如果子模板中含有同名的循環(huán),就會(huì)覆蓋父模板中的值。 在Smarty 3中這些特殊變量將只作用于定義循環(huán)所在的模板。若是需要在子模板中使用,就不得不使用參數(shù)傳遞。 <source lang="smarty"> {include file="path/foo.tpl" index=$smarty.section.foo.index} </source> == SMARTY_RESOURCE_CHAR_SET == Smarty 3 設(shè)置常量 SMARTY_RESOURCE_CHAR_SET 為 utf-8作為模版文件的默認(rèn)字符集.? 只是作為像 escape 等函數(shù)的默認(rèn)字符集. 如果你的模板使用其它字符集, 就必須自己定義這個(gè)常量. == trigger_error() API 函數(shù) trigger_error() 已被移除。 ? == Smarty 常量 == 下面這些常量? SMARTY_PHP_PASSTHRU SMARTY_PHP_QUOTE SMARTY_PHP_REMOVE SMARTY_PHP_ALLOW 已被類(lèi)常量替代 Smarty::PHP_PASSTHRU Smarty::PHP_QUOTE Smarty::PHP_REMOVE Smarty::PHP_ALLOW ? |