Smarty 3.1.35はエラーでしたが、Smarty 3.1.34は動きました。
Smarty 3.1.35はエラー
動作環境は、PHP 5.2.17です。
githubから、Smarty 3.1.35のtgzをダウンロードしてきました。
まず、require_onceのパスだけを編集して、動かしてみました。エラーです。そんなに甘くないですね。
Notice: Undefined property: Smarty_Internal_Undefined::$objMap in /xxxx/smarty-3.1.35/libs/sysplugins/smarty_internal_extension_handler.php on line 132
Fatal error: Uncaught --> Smarty: undefined extension class 'Smarty_Internal_Method_Config_Load' <-- thrown in /xxxx/smarty-3.1.35/libs/sysplugins/smarty_internal_undefined.php on line 62
Code language: plaintext (plaintext)
見たこともないエラーで、とほうにくれてしまうね...
ディレクトリ構成も大きく変わっていて、Smarty3とSmarty2は互換性がないのかもしれないと、少々あきらめムードに。
公式サイトには「PHP 5.2+(対応)」と書いてあるので、もう少し粘りながら、Smarty3下のファイルを見ていると、Smarty.class.php の下に、SmartyBC.class.php というファイルがあります。中を見てみると
Smarty Backward Compatibility Wrapper Class (Smarty後方互換用ラッパークラス)
このファイルですね!
Smarty2クラス | Smarty3クラス | 互換性 |
---|---|---|
Smartyクラス | Smartyクラス(Smarty.class.php) | なし |
Smartyクラス | SmartyBCクラス(SmartyBC.class.php) | あり |
Smarty2のSmartyクラスと、Smarty3のSmartyクラスは大幅に変わり、互換性がありません。そこで、Smarty2のSmartyクラスと互換性のある、Smarty3のSmartyBCクラスが用意されていました。
さっそく、require_onceのパスをSmartyBC.class.phpにして、SmartyBCクラスをextendsしました。
他には、Smarty2のplugins/自作プラグインをSmarty3のlibs/pluginsにコピーしました。
まだ、エラーです。
Parse error: syntax error, unexpected '[' in /xxxx/smarty-3.1.35/libs/sysplugins/smarty_internal_parsetree_template.php on line 130
Code language: plaintext (plaintext)
該当箇所を見ると、array()
ではなく、[]
が使われていました。
$chunks = [];
Code language: PHP (php)
あちゃー、PHP 5.4+ の配列の短縮構文が使われていました...
公式サイトの「PHP 5.2+」の表示は、古い情報のままで、アップデートされていないのかもしれません。
しょうがないわよ、古い環境をサポートするのも面倒よ。
最新masterとSmarty 3.1.34は動いた
仮に、公式サイトの表示「PHP 5.2+」が古い情報だとしても、Smarty 3の以前のバージョンでは、PHP 5.2で動いたはずです。PHP 5.2で動きそうなバージョンを探すため、github cloneしました。
最新のmasterで、試しに動かしてみると、あれ?動きます。さきほど配列の短縮構文 []
の箇所でエラーだったファイルを確認すると、[]
ではなくarray()
になっています!
$chunks = array();
Code language: PHP (php)
gitのコミットログを調べました。
2020-04-14、$chunks = [];
がマージされて、v3.1.35がリリースされました。
これで、PHP 5.2で動かなくなったのね。
その3週間後の05-05、PHP 5.3 compatibility fixes #591」がプルリクエストされました。配列の短縮構文を $chunks = array();
に修正したコミットです。このプルリクエストのコメント欄では、
PHP 5.3をサポートする意味はないと思うけど
https://github.com/smarty-php/smarty/pull/591#issuecomment-623757668
PHP 5.3との互換性を切るのに、Smartyのバージョンを上げないのはよくないよ。
https://github.com/smarty-php/smarty/pull/591#issuecomment-623762731
(PHP 5.3との互換性を切るなら、Smartyのバージョンを上げないとね)
という議論がかわされて、無事、マージされました。
だから、最新のmasterブランチは動いたんだね!
互換性とサポートについて、参考になるわね
次回リリース(3.1.37)では、PHP 5.2で動くと予想されます。
今回は、v3.1.34で試してみると動いたので、v3.1.34を選びました。
バージョン | PHP 5.2 | コメント |
---|---|---|
(次回リリース Smarty 3.1.37) | PHP 5.2 でも動くと予想されます。 | |
2020-09-13 04:37:31 c295786 | ○ | 記事投稿時の最新コミット |
2020-05-05 07:37:36 eae19f2 | おそらく ○ | PHP 5.3 compatibility fixes。配列の短縮構文を array() に置換。 |
Smarty 3.1.36 | おそらく エラー | 一部ファイルで、PHP 5.4以降の配列の短縮構文が使われていた |
Smarty 3.1.35 | エラー | 一部ファイルで、PHP 5.4以降の配列の短縮構文が使われていた |
Smarty 3.1.34 | ○ |