我有一个现有的,功能齐全的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之间的一些根本区别,它正在咬我,但我似乎无法弄清楚它是什么。有人可以给我一些关于如何解决这个问题的建议吗?
答案 0 :(得分:2)
如果您使用的是旧版Smarty,则可能需要更新。在3.1.28中添加了一些针对PHP 7兼容性的修复,这可能对此有所帮助。
请参阅https://github.com/smarty-php/smarty/blob/master/change_log.txt
答案 1 :(得分:0)
此问题的解释(除了最常见的问题,例如“您的版本已过时”)是在PHP 7中,它已更改了代码解析方式。就您而言:
$this->smarty->registered_plugins[$plugin_type][$tag][0];
是parsed differently in PHP 5 and 7:
PHP 5:$this->smarty->{registered_plugins[$plugin_type][$tag][0]};
PHP 7:($this->smarty->registered_plugins)[$plugin_type][$tag][0];
您可以尝试通过放置括号和括号来指示解析器的确切意图来修复这些代码段,但我建议您升级Smarty。