1

我在 PHP 5.2 的第 2 行和第 13 行有错误,我不知道要进行更正,我尝试使用 create_function 但不起作用,有人可以帮忙吗?

function _process_special_keyword($str){
   $callback = function($match){
     $ret = $match[1] . '[' . $match[2] . ']';
     if(!empty($match[3])){
       $ret .= '.[' . $match[3] . ']';
     } 
     $ret .= $match[4];
     return $ret;           
   };

   $strSQL = preg_replace_callback('/([\s\(\.,])(' . SPECIAL_KEYWORDS . ')(?:\.(' . SPECIAL_KEYWORDS . '))?([\s\)\.,])/i', $callback, $str);

   $callback = function($match){
     return 'CASE WHEN ' . $match[1] . ' THEN ' . $match[2] . ' ELSE ' . $match[3] . ' END';
   };

   $strSQL = preg_replace_callback('/if\s*\((.+),(.+),(.+)\)/i', $callback, $strSQL);
   return $strSQL;
}

谢谢。

错误:解析错误:语法错误,意外的 T_FUNCTION

4

3 回答 3

4

使用 时create_function(),第一个参数的内容应该是 PHP 代码的字符串表示形式,它将填充function声明的括号。第二个参数应该只包含函数声明的花括号内的代码{},实际的声明本身应该被省略。

试试这个代码:

function _process_special_keyword($str){

   $callback = create_function(
     '$match',
     '
       $ret = $match[1] . "[" . $match[2] . "]";
       if(!empty($match[3])){
         $ret .= ".[" . $match[3] . "]";
       } 
       $ret .= $match[4];
       return $ret;
     '
   );

   $strSQL = preg_replace_callback('/([\s\(\.,])(' . SPECIAL_KEYWORDS . ')(?:\.(' . SPECIAL_KEYWORDS . '))?([\s\)\.,])/i', $callback, $str);

   $callback = create_function(
     '$match',
     'return "CASE WHEN " . $match[1] . " THEN " . $match[2] . " ELSE " . $match[3] . " END";'
   );

   $strSQL = preg_replace_callback('/if\s*\((.+),(.+),(.+)\)/i', $callback, $strSQL);
   return $strSQL;
}
于 2012-04-05T15:14:18.423 回答
3

您可以在此函数之外声明回调。像这样:

function _callback_one($match){
  $ret = $match[1] . '[' . $match[2] . ']';
  if(!empty($match[3])){
    $ret .= '.[' . $match[3] . ']';
  } 
  $ret .= $match[4];
  return $ret;           
}

function _callback_two($match){
  return 'CASE WHEN ' . $match[1] . ' THEN ' . $match[2] . ' ELSE ' . $match[3] . ' END';
}

function _process_special_keyword($str){
   $strSQL = preg_replace_callback('/([\s\(\.,])(' . SPECIAL_KEYWORDS . ')(?:\.(' . SPECIAL_KEYWORDS . '))?([\s\)\.,])/i', '_callback_one', $str);

   $strSQL = preg_replace_callback('/if\s*\((.+),(.+),(.+)\)/i', '_callback_two', $strSQL);
   return $strSQL;
}

注意:如果这些函数在一个类中(意味着函数需要像 一样调用$this->_callback_one),则传递一个数组作为“回调”参数。

function _process_special_keyword($str){
   $strSQL = preg_replace_callback('/([\s\(\.,])(' . SPECIAL_KEYWORDS . ')(?:\.(' . SPECIAL_KEYWORDS . '))?([\s\)\.,])/i', array($this, '_callback_one'), $str);

   $strSQL = preg_replace_callback('/if\s*\((.+),(.+),(.+)\)/i', array($this, '_callback_two'), $strSQL);
   return $strSQL;
}
于 2012-04-05T15:15:09.753 回答
0

根据对象问题,我认为更快的方式是这样的,

$f = <<<myfunc
 \$ret = \$match[1] . '[' . \$match[2] . ']';
 if(!empty(\$match[3])){
   \$ret .= '.[' . \$match[3] . ']';
 } 
 \$ret .= \$match[4];
 return \$ret;           
myfunc;

$callback = create_function('$match',$f);

注意 $ 和 <<< FLAG FLAG 之前的反斜杠;构造。在实践中,火箭的答案更简单。

于 2012-04-05T15:26:04.490 回答