在PHP中创建奇怪的数组?

Dex*_*ter 2 php arrays variables scope

我正在阅读mysqli_stmt_bind_result 的PHP手册,并在评论中看到了这段代码:

while ( $field = $meta->fetch_field() ) {
  $parameters[] = &$row[$field->name];
}
Run Code Online (Sandbox Code Playgroud)

鉴于在该行之前既没有$ params也没有$ row,为什么/该行如何工作?

Khe*_*hez 6

PHP实际上没有变量声明.这意味着在某些情况下,您可以引用变量而无需事先声明它们.我说一些案例是因为:

foreach($undefinedArray as $key=>$value){
    // will give a notice and a warning
    // notice: undefined variable
    // warning: invalid argument to foreach
}
Run Code Online (Sandbox Code Playgroud)

但这并不意味着你不能这样做:

for($i=0;$i<5;$i++){
    $undefinedArray[]=$i;
}
// will create an array with 5 indexes, each holding the numbers 0 through 4
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为$undefinedArray没有在运行中找到和创建.

现在,关于你自己的情况.我会假设你的意思是这篇文章.而且我不得不承认,这是一个非常有趣的解决方案,我会试着抑制自己在那里评论任何一种不良做法,但让我们继续解释它!

$params[] = &$row[$field->name]; 
Run Code Online (Sandbox Code Playgroud)

这就是魔术发生的地方,实际上是由于&.因为&$row['unknown_index'],实际上创建了索引!

这意味着上面的语句做了两件事.首先,它创建一个数组,每个列名都保存为$row($row[$field->name])中的索引.然后,它保存一个指针到每个元件的从$row$params.

call_user_func_array(array($stmt, 'bind_result'), $params); 
Run Code Online (Sandbox Code Playgroud)

这样做$stmt->bind_result().但是将每个元素$params作为参数传递给bind_result.因为它们是通过引用传递的,所以$ row的每个索引都将保存每个选定的字段.

其余的应该很容易弄清楚.

如果您有任何疑问.随意问!