1

PHP-FineDiffプロジェクトでクラスをサービスとして使用しています。diff の作成は正常に機能しますが、eg を使用して diff を復元しようとするとFineDiff::renderToTextFromOpcodes()、何も起こりません。

コードを少し調べたところ、コールバックが機能しないことがわかりました。一部コメントアウト後

if ( !is_callable($callback) ) {
    return;
}

エラーが発生します:

警告: call_user_func() は、パラメータ 1 が有効なコールバックであることを期待しています。クラス 'FineDiff' が /var/www/sopos-blog/src/Sopos/WikiBundle/Services/FineDiff.php 行 321 に見つかりません。

関連するコード行を次に示します。

public static function renderToTextFromOpcodes($from, $opcodes) {
    ob_start();
    FineDiff::renderFromOpcodes($from, $opcodes, array('FineDiff','renderToTextFromOpcode'));
    return ob_get_clean();
}

// ...

public static function renderFromOpcodes($from, $opcodes, $callback) {
    if ( !is_callable($callback) ) {
        return;
        }
    $opcodes_len = strlen($opcodes);
    $from_offset = $opcodes_offset = 0;
    while ( $opcodes_offset <  $opcodes_len ) {
        $opcode = substr($opcodes, $opcodes_offset, 1);
        $opcodes_offset++;
        $n = intval(substr($opcodes, $opcodes_offset));
        if ( $n ) {
            $opcodes_offset += strlen(strval($n));
            }
        else {
            $n = 1;
            }
        if ( $opcode === 'c' ) { // copy n characters from source
            call_user_func($callback, 'c', $from, $from_offset, $n, '');
            $from_offset += $n;
            }

// ...
4

2 に答える 2

1

クラスのFQCNはであると思いますSopos\WikiBundle\Services\FineDiff。したがって、コールバックは次のいずれかである必要があります。

$arrayCallback = array(__NAMESPACE__.'\FineDiff','renderToTextFromOpcode');
$stringCallback = __NAMESPACE__.'\FineDiff::renderToTextFromOpcode';

__NAMESPACE__実際の名前空間に置き換えることもできます。

于 2012-08-10T15:01:33.750 に答える
0

Symfony2 はクラスを自動ロードできませんFineDiff。名前空間をコールバックに追加します。

public static function renderToTextFromOpcodes($from, $opcodes) {
  ob_start();
  FineDiff::renderFromOpcodes($from, $opcodes, array(__NAMESPACE__.'\FineDiff','renderToTextFromOpcode'));
  return ob_get_clean();
}
于 2012-08-10T15:03:00.643 に答える