【问题标题】:Convert anonymous function in PHP 5.3 into PHP 5.2 equivalent将 PHP 5.3 中的匿名函数转换为 PHP 5.2 等效函数
【发布时间】:2012-04-19 08:19:39
【问题描述】:

我在 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

【问题讨论】:

  • ups,抱歉错过了,这里是错误:解析错误:语法错误,意外的 T_FUNCTION

标签: php closures anonymous


【解决方案1】:

当使用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;
}

【讨论】:

    【解决方案2】:

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

    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;
    }
    

    【讨论】:

    • 把它移到外面是可以的,假设它不是一个闭包
    • @newacct:很确定 PHP 5.2 无论如何都不能做闭包。
    【解决方案3】:

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

    $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);
    

    注意 $ 和

    【讨论】:

    • 使用 Nowdocs (&lt;&lt;&lt;'myfunc') 避免转义 $s ;-)
    • @DaveRandom:您不能在 PHP 5.2 中使用“nowdoc”语法。 php.net/manual/en/…
    • @Rocket 你知道,我才意识到这一点,然后回到这里这么说,但你打败了我!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    相关资源
    最近更新 更多