2012-04-05 6 views
1

PHP 5.2で2行目と13行目にエラーがありますが、私は修正するつもりはありません、create_functionを使ってみましたが、誰も助けてくれませんか?PHP 5.3の匿名関数をPHP 5.2の同等のものに変換する

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

+0

エラーは...? – Bot

+0

ups、申し訳ありませんが、ここにエラーがあります:パースエラー:予期しない構文エラー、予期しないT_FUNCTION – Bonn

答えて

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

外に移動しても問題ありません。閉鎖ではないと仮定してもOKです。 – newacct

+0

@newacct: –

4

create_function()を使用して、最初の引数の内容がfunction宣言に括弧を埋めるだろうPHPコードの文字列表現でなければなりません。 2番目の引数には、関数宣言の中括弧{}の中のコードのみを含める必要があります。実際の宣言自体は省略してください。

は、このコードを試してみてください。

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

は、私が考えるより高速な方法は、そのようなものである

$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;構築する。実際には、Rocketの答えはもっと簡単です。

+0

'$' sをエスケープするのを避けるためにNowdocs( '<<< 'myfunc'')を使用してください – DaveRandom

+0

@DaveRandom wow :)それはクールだ:DIはそれを知らなかった –

+0

@DaveRandom: PHP 5.2で "nowdoc"構文を使用します。 http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.nowdoc –

関連する問題