Я не думаю, что вы можете сделать что-то подобное в 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
.