Переменная область для функций обратного вызова PHP - PullRequest
1 голос
/ 08 июня 2009

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

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

  • Реализовать обратный вызов как функцию частного класса, передав '$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 ]

2 голосов
/ 08 июня 2009
  • Реализовать обратный вызов как функцию частного класса, передав '$ 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 голосов
/ 08 июня 2009

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

...