2012-04-05 4 views
1

Ich habe Fehler in Zeile 2 und 13 in PHP 5.2 habe ich keine Ahnung, um die Korrektur zu machen, habe ich versucht mit create_function aber nicht funktioniert, kann jemand dabei helfen?Konvertieren anonyme Funktion in PHP 5.3 in PHP 5.2 äquivalent

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

Danke.

Fehler: Parse error: Syntaxfehler, unerwartete T_FUNCTION

+0

und der Fehler ist ...? – Bot

+0

ups, sorry verpasste das, hier ist der Fehler: Parse-Fehler: Syntaxfehler, unerwartete T_FUNCTION – Bonn

Antwort

3

Sie die Rückrufe außerhalb dieser Funktion erklären kann. Wie folgt aus:

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

Hinweis: Wenn diese Funktionen in einer Klasse sind (dh die Funktion würde wie $this->_callback_one genannt benötigen werden), ein Array als „Rückruf“ Parameter übergeben.

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

es außerhalb verschieben ist okay, vorausgesetzt, es ist keine Schließung – newacct

+0

@newacct: Ziemlich sicher PHP 5.2 kann Schließungen sowieso nicht tun. –

4

Wenn create_function() verwenden, sollte der Inhalt des ersten Arguments eine String-Darstellung des PHP-Code sein, der die Klammern für die function Erklärung füllen würde. Das zweite Argument sollte nur den Code innerhalb der geschweiften Klammern {} der Funktionsdeklaration enthalten, die eigentliche Deklaration selbst sollte weggelassen werden.

Versuchen Sie diesen Code:

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

nach mit dem Objekt Frage, desto schneller Weg, ich denke, ist so etwas wie so,

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

Note Schrägstriche vor $ und < < < FLAG FLAG; bauen. In der Praxis ist die Antwort von Rocket einfacher.

+0

Verwenden Sie Nowdocs ('<<< 'myfunc''), um zu vermeiden, den' $ 's zu entkommen ;-) – DaveRandom

+0

@DaveRandom wow :) das ist cool: DI wusste es nicht –

+0

@DaveRandom: Sie können nicht verwenden" nowdoc "Syntax in PHP 5.2. http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.nowdoc –