函数调用本身,这可能吗?

时间:2013-12-24 12:29:13

标签: php arrays function recursion sanitization

我一直在寻找互联网,试图在PHP中学习更多有关消毒和验证的知识,这是我第二次遇到这种类型的函数时,我很难理解这个foreach语句是如何工作的。

这是代码,取自here

function sanitize($input) {
    if (is_array($input)) {
        foreach($input as $var=>$val) {
            $output[$var] = sanitize($val);
        }
    }
    else {
        if (get_magic_quotes_gpc()) {
            $input = stripslashes($input);
        }
        $input  = cleanInput($input);
        $output = mysql_real_escape_string($input);
    }
    return $output;
}

所以我的疑问在于foreach语句,如果$input is_array,其中数组的每个索引都通过正在创建的函数传递。对于像我这样的新手程序员,我不确定如何在创建过程中将其称为中途。

我已经完成了一些传授这个想法并认为我已经得到了答案,但我不确定是否就是这种情况,这就是为什么我要问这个问题,无论是对某些文献的确认和指导这可能有助于我掌握这种“使用”。

所以我认为当函数调用sanitize($someArray);时,它将在if语句中求值为true并运行foreach。在每个索引运行sanitize($val);时,它将跳转到else语句并运行“单值”指令。除非$input当然是一个数组数组,在这种情况下,它会重复第一步,直到每个数组中的每个项都被清理。

我怀疑,因为这是我在某种程度上看到的:

function sanitize($input) {
    if(foo){sanitize($input->i);}
    else {...}
}

我本能地期待一个无限循环。

这有意义吗?这是代码中的错误吗?它是否有机会无限期运行?

2 个答案:

答案 0 :(得分:2)

在创建函数之前,函数不会被调用。它只能在较小的原始输入上运行。最终会达到一个不是数组的东西,递归的级别将会消失。

答案 1 :(得分:1)

不,这是递归的,但是直到死亡都不会让我们分开。

您有一个函数sanitize(sanitize.1)的实例。那收到了一个数组。实际上,它是一个数组,它将调用一个函数sanitize(为了清楚起见,我们称之为Sanitize.2)。这与sanitize相邻。

但是,在sanitize.1中,您只将一个值传递给该函数。确实,它会跳转到函数的else部分。清理变量。返回已清理的输入,然后再次消失。那时,清理1步骤到数组中的下一个元素,并再次运行整个事件。

在你传递的数组的每个元素也是一个数组的情况下,它仍然可以工作:每个子数组都以相同的方式处理,你得到sanitize.1调用sanitize.2,而sanitize.2又调用sanitize。你可以做得无限。由于计算机非常适合跟踪他们正在做什么,他们可以做到这一点,你和我在一张纸上会弄得很糟糕; D