Обновление Smarty3 до PHP7 и странные проблемы с плагином регистрации

У меня есть существующее, хорошо функциональное приложение PHP. Я изучаю обновление сервера, которое включает переход с PHP5 на PHP7. Насколько я могу судить из документации, Smarty3 должен быть совместим с PHP7. Однако при проверке этого выясняется, что Smarty отказывается компилировать шаблоны после обновления.

Источником проблемы, похоже, является эта строка:

$this->smarty->registerPlugin('compiler', 'asset_url',  array(&$this, 'asset_url'));

что приводит к сбою приложения PHP следующим образом:

Notice: Array to string conversion in /usr/share/php/smarty3/sysplugins/smarty_internal_templatecompilerbase.php on line 415

Notice: Undefined property: template::$Array in /usr/share/php/smarty3/sysplugins/smarty_internal_templatecompilerbase.php on line 415

Fatal error: Uncaught Error: Function name must be a string in /usr/share/php/smarty3/sysplugins/smarty_internal_templatecompilerbase.php:415
Stack trace:
#0 /usr/share/php/smarty3/sysplugins/smarty_internal_templateparser.php(3585): Smarty_Internal_TemplateCompilerBase->compileTag('asset_url', Array)
#1 /usr/share/php/smarty3/sysplugins/smarty_internal_templateparser.php(4413): Smarty_Internal_Templateparser->yy_r32()
#2 /usr/share/php/smarty3/sysplugins/smarty_internal_templateparser.php(4515): Smarty_Internal_Templateparser->yy_reduce(32)
#3 /usr/share/php/smarty3/sysplugins/smarty_internal_smartytemplatecompiler.php(118): Smarty_Internal_Templateparser->doParse(3, '}')
#4 /usr/share/php/smarty3/sysplugins/smarty_internal_templatecompilerbase.php(283): Smarty_Internal_SmartyTemplateCompiler->doCompile('<!DOCTYPE html>...')
#5 /usr/share/php/smarty3/sysplugins/smarty_internal_template.php(197): Smarty_Internal_TemplateCompilerBase->compileTemplate(Object(Smarty_Internal_Template))
#6 /usr/share/php/smarty3/sysplugins/sm in /usr/share/php/smarty3/sysplugins/smarty_internal_templatecompilerbase.php on line 415

Подозрительная строка 415 выглядит так:

 $function = $this->smarty->registered_plugins[$plugin_type][$tag][0];
 if (!is_array($function)) {
     return $function($new_args, $this);
 } elseif (is_object($function[0])) {
     return $this->smarty->registered_plugins[$plugin_type][$tag][0][0]->$function[1]($new_args, $this); <- Crash here!
 } else {
     return call_user_func_array($function, array($new_args, $this));
 }

Я предполагаю, что это какая-то фундаментальная разница между PHP5 и PHP7, которая меня кусает, но я не могу понять, в чем она заключается. Может ли кто-нибудь дать мне несколько советов, как разобраться в этом?


person pehrs    schedule 24.05.2016    source источник
comment
Знаете ли вы, какую именно версию Smarty вы используете? В выпуске 3.1.28 были некоторые исправления для PHP 7.   -  person iainn    schedule 24.05.2016
comment
Я использую 3.1.21-1ubuntu1. Это, безусловно, стоит исследовать!   -  person pehrs    schedule 24.05.2016
comment
@iainn Похоже, проблема была в этом! Не могли бы вы создать ответ для меня, чтобы принять?   -  person pehrs    schedule 24.05.2016


Ответы (2)


Если вы используете более старую версию Smarty, вы можете обновить ее. В 3.1.28 были добавлены некоторые исправления для совместимости с PHP 7, которые, вероятно, помогут в этом.

См. https://github.com/smarty-php/smarty/blob/master/change_log.txt

person iainn    schedule 24.05.2016

Объяснение этой проблемы (кроме наиболее распространенных, таких как «у вас устаревшая версия») заключается в том, что в PHP 7 был изменен способ разбора кода. В твоем случае:

$this->smarty->registered_plugins[$plugin_type][$tag][0];

разбирается по-разному в PHP 5 и 7:

PHP 5: $this->smarty->{registered_plugins[$plugin_type][$tag][0]};

PHP 7: ($this->smarty->registered_plugins)[$plugin_type][$tag][0];

Вы можете попытаться исправить эти фрагменты кода, поместив фигурные скобки и квадратные скобки, чтобы указать синтаксическому анализатору, каковы ваши точные намерения, но я бы посоветовал вам обновить Smarty.

person Zsolti    schedule 11.10.2018