1

警告:preg_replace_callback()[function.preg-replace-callback]:引数2、'info'が[...]の有効なコールバックである必要があります

public function getDisplay(){
    $info = array_merge($this->info,array());

    return  preg_replace_callback('!\{\{(\w+)\}\}!', 'info', $this->display);
}

「MyClass」のパブリック関数で、別のクラスからこのクラスに移動すると動作を停止しました。どれが:

public function getEdit( $type){
    $all_info = $this->info;

    return preg_replace_callback('!\{\{(\w+)\}\}!', 'all_info', $edit_contents);
}

両方ともクリーンアップされており、以前のクラスはすでに終了しているため、再テストできません。

変数の使用は許可されていないことは確かですが、それは機能していたので、私にはわかりません。

私がこれを行うとき、いくつかのスタックオーバーフロースレッドで提案されているように、しかし明らかにそれはオブジェクト内で使用されるようには作られていません:

public function getDisplay(){
    $display_info = $this->info;

    function display_info($matches) {
        global $display_info;
        return $display_info[$matches[1]];
    }

    return  preg_replace_callback('!\{\{(\w+)\}\}!', 'display_info', $this->display);
}

だから私はいくつかの愛とガイダンスが必要ですcuzphpは今週私を夢中にさせています...

4

3 に答える 3

13

匿名関数やより複雑なメソッドを使用する代わりに、コールバックの受け渡しでサポートされているメソッドの1つを使用できます(コールバックに関するドキュメントを参照)。

インスタンス化されたオブジェクトのメソッドは、インデックス0のオブジェクトとインデックス1のメソッド名を含む配列として渡されます。

現在のオブジェクトの「info」メソッドをコールバックとして渡すには、次のようにします。

array($this, 'info')

そして、他のメソッドのオブジェクトの1つ内のコールバックとして「info」メソッドを使用したい場所にそれを渡します。

于 2012-08-07T07:35:24.360 に答える
4

これを行う正しい方法は、クロージャーを使用することです。

public function getDisplay() {

    // While $this support in closures has been recently added (>=5.4.0), it's
    // not yet widely available, so we'll get another reference to the current
    // instance into $that first:
    $that = $this;

    // Now we'll write that preg... line of which you speak, with a closure:
    return  preg_replace_callback('!\{\{(\w+)\}\}!', function($matches) use($that) {
        return $that->info[$matches[1]];
    }, $this->display);

}
于 2012-06-22T21:56:37.423 に答える
2

これはそれを解決しました:

public function getDisplay(){
    return  preg_replace_callback('!\{\{(\w+)\}\}!', array(get_class($this), '_preg_replace_callback'), $this->display);
}

private function _preg_replace_callback($matches){
    return $this->info[$matches[1]];
}

get_class()以前にこのアプローチを試しましたが、ラップする関数を使用しませんでした$this。ああわざわざ...

于 2012-06-22T21:46:07.790 に答える