У меня есть хорошо работающее 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, которая кусает меня, но я не могу понять, что это такое. Может ли кто-нибудь дать мне несколько советов, как с этим разобраться?
Если вы используете более старую версию Smarty, вы можете обновить ее. В 3.1.28 были добавлены некоторые исправления для совместимости с PHP 7, которые, вероятно, помогут с этим.
Увидеть https://github.com/smarty-php/smarty/blob/master/change_log.txt
Объяснение этой проблемы (помимо наиболее распространенных, таких как «у вас устаревшая версия») заключается в том, что в 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.