2009-06-08 5 views
1

В ответ на другой вопрос, который я задал о регулярных выражениях, мне сказали использовать функцию preg_replace_callback (PHP regex templating - find all occurrences of {{var}}) в качестве решения моей проблемы. Это отлично работает, но теперь у меня есть вопрос, связанный с переменной областью в функциях обратного вызова.Переменная область для функций обратного вызова PHP

Функция, анализирующая текст, является частью класса, но данные, которые я хочу использовать, хранятся локально в функции. Однако я обнаружил, что я не могу получить доступ к этим данным из моей функции обратного вызова. Вот способы, которыми я пытался до сих пор:

  • Реализовать функцию обратного вызова в качестве функции частного класса, передавая '$this->callback_function' в качестве параметра обратного вызова (не работает, PHP имеет фатальную ошибку)
  • Реализовать функцию обратного вызова внутри функции, которая использует его (смотрите пример ниже), но это не сработало, потому что $newData не в сферу внутри callback_function

Любые идеи о том, как я могу получить доступ к $newData внутри моей функции обратного вызова, предпочтительно без использования глобалам ?
Большое спасибо.

Пример ниже для второй попытки (не форматировать должным образом, когда я положил его после точки пули)

public function parseText($newData) { 
    ... 
    function callback_function($matches) { 
    ... //something that uses $newData here 
    } 
    ... 
    preg_replace_callback('...', 'callback_function', $textToReplace); 
} 

ответ

2
  • Реализовать функцию обратного вызова в качестве функции частного класса, передавая '$ this-> callback_function' в качестве параметра обратного вызова (не работает, PHP имеет фатальную ошибку)

preg_replace_callback ('...', 'callback_function', $ textToReplace);

Изменить вызов быть preg_replace_callback ('...', array($this, 'callback_function'), $textToReplace); в то время как callback_function частный метод в вашем классе.

<?php 

class PregMatchTest 
{ 

    private callback_function ($matches) 
    { 
     // ...... 
    } 

    public function parseText ($newData) 
    { 
     // .... 

     preg_replace_callback('...', array($this, 'callback_function'), $textToReplace); 
    } 

} 

?> 
+0

Эй, спасибо, это именно то, что я был после. –

-2

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

Смежные вопросы