Преобразование анонимной функции в PHP 5.3 в эквивалент PHP 5.2

У меня есть ошибка в строке 2 и 13 в PHP 5.2, я не знаю, как исправить, я пытался использовать 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


person Bonn    schedule 05.04.2012    source источник
comment
упс, извините, пропустил это, вот ошибка: Ошибка синтаксического анализа: синтаксическая ошибка, неожиданная T_FUNCTION   -  person Bonn    schedule 05.04.2012


Ответы (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;
}
person Rocket Hazmat    schedule 05.04.2012
comment
перемещение его наружу нормально, если это не закрытие - person newacct; 06.04.2012
comment
@newacct: Почти уверен, что PHP 5.2 все равно не может выполнять замыкания. - person Rocket Hazmat; 06.04.2012

При использовании 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;
}
person DaveRandom    schedule 05.04.2012

в соответствии с вопросом об объекте, чем быстрее я думаю, что-то вроде этого,

$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; построить. На практике ответ Ракеты проще.

person Luca Rainone    schedule 05.04.2012
comment
Используйте Nowdocs (<<<'myfunc'), чтобы избежать необходимости избегать $s ;-) - person DaveRandom; 05.04.2012
comment
@DaveRandom: вы не можете использовать синтаксис nowdoc в PHP 5.2. php.net/manual/ ru/ - person Rocket Hazmat; 05.04.2012
comment
@Rocket Знаешь, я только что понял это и вернулся сюда, чтобы сказать это, но ты меня опередил! - person DaveRandom; 05.04.2012