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, Какая досада...

Другие вопросы по тегам