Smarty 3.1.35は配列の短縮構文が使われていて、PHP 5.2.17でエラー

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 62Code 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 130Code 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のバージョンを上げないのはよくないよ。
(PHP 5.3との互換性を切るなら、Smartyのバージョンを上げないとね)

https://github.com/smarty-php/smarty/pull/591#issuecomment-623762731

という議論がかわされて、無事、マージされました。

だから、最新の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
タイトルとURLをコピーしました