Передача более одного аргумента в функцию обратного вызова (с использованием PHP 5.2) - PullRequest
1 голос
/ 20 августа 2010

Я пишу систему управления контентом.Администратор страницы вводит контент для страницы и, когда он вводит число, окруженное специальными символами, он заменяется записью базы данных на экране средства просмотра при анализе.Чтобы выполнить это при разборе, я использую preg_replace_callback ().Однако я не могу передать переменную соединения с базой данных в функцию обратного вызова, поэтому она не будет работать.В качестве краткосрочного обходного пути я просто пытаюсь сделать соединение с базой данных глобальной переменной в этом единственном экземпляре и использовать его таким образом, но это всего лишь неаккуратный клочок и не очень хорошая идея для долгосрочной перспективы.

Кто-нибудь знает, как решить мою проблему или даже другой, лучший способ сделать то, что я пытаюсь сделать?

Ответы [ 3 ]

3 голосов
/ 20 августа 2010

Вы должны создать функцию / метод, который обернет ее.

class PregCallbackWrap {
    private $dbcon;
    function __construct($dbcon) { $this->dbcon = $dbcon; }
    function callback(array $matches) {
        /* implementation of your callback here. You can use $this->dbcon */
    }
}
$dbcon = /* ... */
preg_replace_callback('/PATTERN/',
    array(new PregCallbackWrap($dbcon), 'callback'), $subject,);

В PHP 5.3 вы можете просто сделать:

$dbcon = /* ... */
preg_replace_callback('/PATTERN/',
    function (array $matches) use ($dbcon) {
        /* implementation here */
    },
    $subject
);
0 голосов
/ 14 июня 2011

Ответ Артефакто является правильным (и должен быть принят ОП), но для любого, кто ищет более общее решение, вы можете обратиться к этому вопросу на SE

0 голосов
/ 20 августа 2010

В обратном вызове вы могли бы вызвать функцию, которая возвращает соединение с базой данных?Например, singleton класс , который имеет соединение с базой данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...