我知道这是一个noob问题,但是有人可以向我解释这个功能发生了什么吗?
// 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";
具体而言,$i
和$n
的值是多少? $args = null
意味着什么以及它如何适应while循环?
答案 0 :(得分:0)
函数mutator
接受一个数组,在其体内,它将数组的每个元素更改为字符串“mutated”,并且不返回任何内容。通常,对于在该函数的上下文之外传递到mutator
的数组没有影响,事实上,该函数根本没有做任何事情是不明显的。但是,因为元素$b
通过引用(&$b
)传递,所以该函数能够修改它。这就是为什么您的代码将打印“hello mutated world”。
$n
由语句$n=count($args);
设置,该语句返回变量$args
$i
是一个变量,它将在while循环中递增($i++
。)因为$n
是$args
中元素的数量,所以循环($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没有帮助。)
答案 1 :(得分:-1)
function a() {
if (func_num_args() > 0) {
foreach (func_get_args() as $arg) {
var_dump($arg);
}
}
}
然后:
a('one', 'two', 'three', 'and so on...');