Предупреждение: 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); }
Так что мне нужна любовь и наведение cuz php заставляет меня сходить с ума на этой неделе …
Правильный способ сделать это будет с закрытием:
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
. Какая досада…