我的主人突然改变了一些东西,现在我的网站(大部分是wp - 大约100)都得到了臭名昭着的错误Invalid opcode 153/1/8
负责的行:
$f = function() use ($out) {
echo $out;
};
经过2分钟的研究后,罪魁祸首似乎是eAccelerator,does not support anonymous functions
以下两个问题都归咎于eAccelerator上的错误:
Invalide OpCode and php sort function,
https://stackoverflow.com/a/12085901/1244126
有趣的事实:相同的代码已经出现在我自己的2个问题here on SE和here的主题之前,我在使用时遇到了问题
带有create_function
$f = create_function(' $out ',' global $out; echo $out;');
所以,我的问题是:如何以避免eAccelerator错误的方式更改我的代码并且将在所有php版本上运行。 (我不太可能说服我的主人改变它的一面)
编辑I:
为了清楚起见(尽管可能稍微不相关 - 问题是如何使用交叉兼容的匿名函数) - 我发布了相关的全部代码......
if ( count( $content_widget ) > 0 ) { // avoid error when no widget...
$i=0;
foreach ( $content_widget as $wid ){
$out = null;
$i++;
$widg_id = 'o99_dashboard_widget_dyn_' . $i;
$widg_name = 'widget name - ' . $i;
$out = $wid;
// $f = create_function('$out','global $out;echo $out;');
// $f = create_function('', 'global $out; echo $out ;');
$f = function() use ($out) {
echo $out;
};
// function() use ($out) // NOPE
// $f = $f($out); // NOPE again
wp_add_dashboard_widget($widg_id, $widg_name, $f);
// $i++;
}
}
这只是一个在wp管理区域动态创建仪表板小部件的简单代码。
答案 0 :(得分:0)
他们似乎正在使用call_user_func
因此,您可以创建新对象并传递可调用数组。
class s {
private $_out = null;
public function __construct($out){
$this->_out = $out;
}
public function a(){
echo $this->_out;
}
}
$function = array(new S('my out'), 'a');
var_dump(is_callable($function));
call_user_func($function);