2

callable (匿名関数) を eval の文字列に変換するにはどうすればよいですか?

runkitを使用してメソッドをオーバーライドする単体テストを phpunit で作成しようとしています。特に、後で呼び出さrunkit_method_redefine()れる文字列パラメーターが必要です。eval()

テストコードの構文を強調表示したいので、文字列内にコードを書きたくないので、次のようなことをしたい

deEval(function(){ 
   return 1;
});

それは出力します

"return 1;"

これを簡単に行うにはどうすればよいでしょうか (たとえば、ソース ファイルの fopen を実行したり、ソース行を見つけたり、解析したりせずに)?

4

2 に答える 2

1

あまり効率的ではない関数を書きました..(引数を考慮していません)

/**
 * Converts method code to string by reading source code file
 * Function brackets {} syntax needs to start and end separately from function body
 *
 * @param Callable $callable method to deevaluate
 *
 * @return string
 */
public function callableToString($callable) {
    $refFunc = new ReflectionFunction($callable);
    $startLine = $refFunc->getStartLine();
    $endLine   = $refFunc->getEndLine();

    $f      = fopen($refFunc->getFileName(), 'r');
    $lineNo = 0;

    $methodBody = '';
    while($line = fgets($f)) {
        $lineNo++;
        if($lineNo > $startLine) {
            $methodBody .= $line;
        }
        if($lineNo == $endLine - 1) {
            break;
        }
    }
    fclose($f);

    return $methodBody;
}
于 2013-10-31T11:21:58.003 に答える