Преобразование анонимной функции в 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

Вы можете объявлять обратные вызовы вне этой функции. Как это:

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

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

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

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