create_function() 的补丁导致 PHP 7.3.6 出现问题

Patch for create_function() causes problems in PHP 7.3.6

我正在尝试替换 CMS 中已弃用的 "create_function"。我已经找到了很多关于这个话题的答案。但是,我使用的补丁导致了更多的麻烦,我对PHP这种级别的功能并不是很坚定。因此,如果有人能帮助我,我会很高兴。

我变了

$list->setColumnFormat('active', 'custom', create_function(
  '$params',
  'global $I18N;
   $list = $params["list"];
   return $list->getValue("active") == 1 ? $I18N->msg("yes") : $I18N->msg("no");'
));

$list->setColumnFormat('active', 'custom', function($params) {
  global $I18N; 
  $list = $params["list"]; 
  return $list->getValue("active") == 1 ? $I18N->msg("yes") : $I18N->msg("no");
});

然而 - 而不是只是一条 "deprecated" 消息 - 我得到

Recoverable fatal error: Object of class Closure could not be converted to string in [filename] on line 155

第 155 行是:

trigger_error('rexCallFunc: Using of an unexpected function var "'.$function.'"!');

var_dump($function) 给出:

object(Closure)#16 (1) { ["parameter"]=> array(1) { ["$params"]=> string(10) "" } }

如果我将第 155 行注释掉,我还会得到:

Warning: call_user_func() expects parameter 1 to be a valid callback, function '' not found or invalid function name in [the same filename] on line 163

第 163 行是:

return call_user_func($func, $params);

var_dump($func) 给出:

string(0) "" 

有人知道这是怎么回事以及如何解决吗?

create_function returns a string 带有 "anonymous" 函数的名称,而不是匿名函数。如果您想避免更改 setColumnFormat() 方法,您需要创建一个命名函数而不是匿名函数,并将该名称作为 setColumnFormat() 可以在 call_user_func() 中使用的字符串传递.

function patchFunction($params) {
    global $I18N; 
    $list = $params["list"]; 
    return $list->getValue("active") == 1 ? $I18N->msg("yes") : $I18N->msg("no");
}

$list->setColumnFormat('active', 'custom', 'patchFunction');