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

两者都被清理了,现在我无法重新测试以前的课程,因为它已经很久了。

我确定不允许使用变量但它正在工作,所以我一无所知。

当我这样做时,正如一些stackoverflow线程中所建议的那样,但显然它不是在对象中使用的:

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

所以我需要一些爱和指导,因为本周 php 让我发疯......

4

3 回答 3

13

除了使用匿名函数或更复杂的方法,您可以只使用一种支持传递回调的方法(请参阅回调文档):

实例化对象的方法作为数组传递,该数组包含索引 0 处的对象和索引 1 处的方法名称。

要将当前对象的“info”方法作为回调传递,只需执行以下操作:

array($this, 'info')

并将它传递到您想要使用“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()wrap 函数$this。哦麻烦...

于 2012-06-22T21:46:07.790 回答