PHP - 函数变量范围中的函数

时间:2013-08-17 00:39:34

标签: php variables scope

我试图在第二个函数中使用第一个函数的参数作为变量,这是我到目前为止工作的方式,但我怀疑这是好方法。请注意,第二个函数(clauseWhere)不能有其他参数。

function filtrerDuree($time) {
    global $theTime;
    $theTime = $time;
    function clauseWhere($where = '') {
        global $theTime;
        return $where .= " AND post_date > '" . date('Y-m-d', strtotime('-' . $theTime. ' days')) . "'";
    }
    add_filter( 'posts_where', 'clauseWhere' );
}

我无法直接在第二个函数中使用参数$ time,如下所示:strtotime(' - '。$ time。'days')),因为它无论如何都是第一个函数的本地函数。

在第二个函数中设置全局$时间不起作用,即使我在第一个函数中执行了$ time = $ time。

另外,我不明白为什么我需要在第一个函数中将$ theTime置于全局...这个变量在函数外部不存在,因此它不使用函数外的任何变量。如果我不把它全球化,它就行不通。但我确实理解,在第二个函数中我需要把它全局化。

2 个答案:

答案 0 :(得分:0)

我建议不要在php中的函数中放置函数。

我的部分原因是:http://www.php.net/manual/en/language.functions.php#16814

因此,从该帖子开始,理论上可以从外部函数外部调用函数内部。

如果单独调用内部函数,它将不知道变量“$ time”,并导致许多问题。我建议不要在另一个函数内部定义函数,并在函数之外定义全局变量,如果可能的话。至于为什么你不能将$ time变量作为参数传递给你的其他函数,我也很困惑。

答案 1 :(得分:0)

根据add_filter如何设置对函数的调用,您可以使用闭包并避免混乱全局空间。

function filtrerDuree($time) {
    add_filter( 'posts_where',  function($where) use ($time){
        return $where .= " AND post_date > '" . date('Y-m-d', strtotime('-'.$time.' days'))."'";
    });
}