Как передать параметры динамически в PHP? - PullRequest
1 голос
/ 11 марта 2010

Мне нужно передать $ route к его внутренней функции, но не удалось:

function compilePath( $route )
{
    preg_replace( '$:([a-z]+)$i', 'pathOption' , $route['path'] );
    function pathOption($matches)
    {
        global $route;//fail to get the $route
    }
}

Я использую php5.3, есть ли какая-то функция, которая может помочь?

Ответы [ 2 ]

5 голосов
/ 11 марта 2010

Я не думаю, что вы можете сделать что-то подобное в PHP 5.2, к сожалению - но, поскольку вы используете PHP 5.3 ... вы можете использовать Closures, чтобы заставить это работать.


Для начала, вот краткий пример использования Closure:

function foo()
{
    $l = "xyz";
    $bar = function () use ($l)
    {
        var_dump($l);
    };
    $bar();
}
foo();

Будет отображаться:

string 'xyz' (length=3)

Обратите внимание на ключевое слово use; -)


И вот пример того, как вы могли бы использовать это в вашем конкретном случае:

function compilePath( $route )
{
    preg_replace_callback( '$:([a-z]+)$i', function ($matches) use ($route) {
        var_dump($matches, $route);
    } , $route['path'] );
}

$data = array('path' => 'test:blah');
compilePath($data);

И вы получите такой вывод:

array
  0 => string ':blah' (length=5)
  1 => string 'blah' (length=4)

array
  'path' => string 'test:blah' (length=9)

Пара заметок:

  • Я использовал preg_replace_callback, а не preg_replace - так как я хочу вызвать некоторую функцию обратного вызова.
  • Я использую анонимную функцию в качестве обратного вызова
  • И эта анонимная функция импортирует $route с новым ключевым словом use.
    • Это означает, что в моей функции обратного вызова я могу получить доступ как к совпадениям, которые всегда передаются preg_replace_callback в функцию обратного вызова, так и к $route.
1 голос
/ 11 марта 2010

Поместите все в класс, включая обратный вызов и захват $ route, используя $ this-> route вместо глобальных. Вы должны использовать preg_replace_callback (). Чтобы использовать обратный вызов из класса, используйте Array ($ class, 'callback') или Array ('className', 'callback).

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