preg_replace_callback() - 当前对象实例内的回调

时间:2012-06-22 21:46:07

标签: php

警告: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);
}

所以我需要一些爱和指导因为这个星期让我疯狂......

3 个答案:

答案 0 :(得分:11)

您可以使用支持传递回调的方法之一(see the documentation on callbacks),而不是使用匿名函数或更复杂的方法:

  

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

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

array($this, 'info')

并将其传递给任何想要使用“info”方法作为其他方法之一的回调。

答案 1 :(得分: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);

}

答案 2 :(得分:1)

这解决了它:

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。哦,麻烦......