警告: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);
}
所以我需要一些爱和指导因为这个星期让我疯狂......
答案 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
。哦,麻烦......