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

Оба очищены, и теперь я не могу повторить тестирование с предыдущим классом, потому что он уже давно ушел.

Я уверен, что использование переменных не допускается, но оно работает, поэтому я не знаю.

Когда я это делаю, как это предлагается в потоке 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 . Какая досада…