Обновление 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, которая кусает меня, но я не могу понять, что это такое. Может ли кто-нибудь дать мне несколько советов, как с этим разобраться?

1

Решение

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

Увидеть https://github.com/smarty-php/smarty/blob/master/change_log.txt

2

Другие решения

Объяснение этой проблемы (помимо наиболее распространенных, таких как «у вас устаревшая версия») заключается в том, что в 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.

0

По вопросам рекламы [email protected]