0

假设我将一个值附加到一个数组,该数组已附加到一个数组:

$a = array();
$b = array();
$b[] = 42;
$a[] = $b;

echo $a[0][0];    

>> 42

输出是(如预期的那样)“42”。现在假设我对我的代码顺序做了一个小改动。此更改应该没有任何区别,因为数组应该通过引用传递。

$a = array();
$b = array();
$a[] = $b;
$b[] = 42;

echo $a[0][0];

>> Notice: Undefined offset: 0 in /opt/iceberg/web/upload/auth.php on line 111

是什么赋予了?在将我的代码简化为这个简化的示例时,我无法摆脱自己犯了一些应该很明显的错误的感觉。任何帮助,将不胜感激!

解决方案

您可以强制按引用分配:

$a = array();
$b = array();
$a[] =& $b;
$b[] = 42;

echo $a[0][0];

>> 42

附录:在更复杂的情况下使用时,=&以神秘的方式工作并导致一些非常奇怪的(对我而言)行为。我认为对于 PHP 新手来说,最好坚持按值赋值。

4

1 回答 1

2

按价值,PHP 中的一切都是 byval,除了对象(可能还有资源?已经有一段时间了)。$a[0]保存一个零长度数组。

如果我们稍微回到过去(到 PHP 4),一切都是按值传递的。从技术上讲$a = new thing();,会创建一个新的事物实例,将其复制到$a中,然后销毁原始实例。这显然是疯狂的谈话。在处理对象时,这对于性能来说是很糟糕的,但让事情变得非常一致。“数组加上一些被砍掉的仙尘”对象模型显然需要一些升级,这就是 PHP 5 引入的。对于 PHP 的大量用户群(想想:办公室里知道如何重置打印机的人,现在负责维护网站),事物的按价值性质使事情变得简单,而且很难完全搞砸。

更多细节:从技术上讲,它不是按价值计算的,它都是写时复制。

于 2013-09-05T19:57:24.000 回答