preg_replace_callback() - обратный вызов внутри текущего экземпляра объекта
Предупреждение: 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);
}
Оба убраны, и теперь я не могу провести повторное тестирование с предыдущим классом, потому что оно уже давно прошло.
Я уверен, что использование переменных недопустимо, но это работало, поэтому я не в курсе.
Когда я делаю это, как предложено в некотором потоке stackru, но, очевидно, он не предназначен для использования внутри объектов:
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 сводит меня с ума на этой неделе...
3 ответа
Правильный способ сделать это будет с закрытием:
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);
}
Вместо использования анонимных функций или более сложных методов, вы можете просто использовать один из методов, поддерживаемых для передачи обратных вызовов ( см. Документацию по обратным вызовам):
Метод экземпляра объекта передается как массив, содержащий объект с индексом 0 и имя метода с индексом 1.
Чтобы передать метод info для текущего объекта в качестве обратного вызова, просто сделайте следующее:
array($this, 'info')
и передавайте его везде, где вы хотите использовать метод "info" в качестве обратного вызова внутри одного из объектов других методов.
Это решило это:
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
, Какая досада...