如何在PHP中动态传递参数?

时间:2010-03-11 05:37:23

标签: php parameters

我需要将$ 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 个答案:

答案 0 :(得分:5)

我不认为你可以在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 - 因为我想要调用一些回调函数。
  • 我正在使用anonymous function作为回调
  • 该匿名函数正在使用新的$route关键字导入use
    • 这意味着,在我的回调函数中,我可以访问两个匹配,这些匹配始终由preg_replace_callback传递给回调函数,以及$route

答案 1 :(得分:1)

将所有内容放入一个类中,包括回调并使用$ this-> route而不是使用全局变量来获取$ route。你应该使用preg_replace_callback()。要使用类的回调,请使用Array($ class,'callback')或Array('className','callback)。