2

I know this is kind of a noob question but can somebody explain to me what is going on in this function?

// Prints "hello mutated world" 
function mutator($args = null) { 
    $n = count($args); 
    while($i<$n) $args[$i++] = "mutated"; 
} 
$a = "hello"; 
$b = "strange"; 
$c = "world"; 
mutator(array($a, &$b, $c)); 
echo "$a $b $c"; 

Specifically, what are the values of $i and $n? What does $args = null mean and how does it fit into the while loop?

4

2 回答 2

0

该函数mutator接受一个数组,并在其主体内将数组的每个元素更改为字符串“mutated”,并且不返回任何内容。通常情况下,传递到该函数上下文外部的数组不会有任何影响mutator,事实上,该函数根本不会做任何事情。但是,因为元素$b是通过引用 ( &$b) 传递的,所以函数可以修改它。这就是您的代码将打印“hello mutated world”的原因。

$n由语句设置,该语句$n=count($args);返回变量中的元素数$args

$i是一个变量,它将在 while 循环 ( $i++) 中递增。因为$n是 中的元素数$args,所以 while 循环的条件($i<$n)意味着循环将为 中的每个元素运行一次$args

$args=null在函数定义中只是为函数提供一个默认值 null 以供在不带参数的情况下调用它时使用。


几年后重新审视这个答案,我想补充几件事。我理解该函数可能只是为了说明将数组中的引用作为函数参数传递的效果,但它不是一个构造良好的 PHP 函数,很容易理解为什么需要看到这种类型的初学者示例会对它的工作方式产生一些疑问。

该定义应该更明显地表明它期望参数是一个数组,并且默认值应该是一个空数组而不是null. 在较新版本的 PHP 中,null它是不可数的,如果在没有参数的情况下调用该函数,则会导致警告。在 PHP 7.1 之后,我们还可以证明它不返回任何内容:

function mutator(array $args = []): void { ...

此外,$i在 while 循环中使用之前是未定义的。在循环的第一次迭代中,它将为 null 直到它增加++,所以它永远不会有值0,并且它不会访问第一个数组元素。您也可以通过将第一个元素作为参考传递来看到这一点;它不会变异。$i应该在循环之前初始化为零,或者for应该使用循环。

for ($i = 0, $n = count($args); $i < $n; $i++) {
    $args[$i] = 'mutated';
}

这种方式$i已定义,因此不会有任何未定义的变量通知,您将能够访问 的第一个元素$args,并且希望它会更明显地发生了什么。(尽管我认为这对五年后的 OP 没有太大帮助。)

于 2013-10-25T22:39:20.857 回答
-1

使用func_*_args()功能

function a() {
    if (func_num_args() > 0) {
        foreach (func_get_args() as $arg) {
            var_dump($arg);
        }
    }
}

然后:

a('one', 'two', 'three', 'and so on...');
于 2013-10-25T21:32:07.030 回答