3
$array = array();
$array[ 'recursive' ] =& $array;

$array[ 'foo' ] = $array;

'foo'被赋值给$array,它应该复制$array,它当时没有'foo'键,所以我希望现在的情况是这样的:

$array = array(
    'recursive' => &$array,
    'foo'       => array(
        'recursive' => &$array
    ),
)

但如果我现在这样做:

var_dump( isset( $array[ 'foo' ][ 'foo' ][ 'foo' ] ) );

我得到:

bool(true)

我不明白为什么会这样。

如果我为 的赋值创建一个中间变量'foo',如下所示:

$array = array();
$array[ 'recursive' ] =& $array;

$blah = $array;
$array[ 'foo' ] = $blah;

var_dump( isset( $array[ 'foo' ][ 'foo' ][ 'foo' ] ) );

我得到:

bool(false)

我理解为什么'recursive'键会无限深,因为它是通过引用分配的,但是为什么'foo'键是按值分配的呢?如何为值处理的事物创建中间变量改变行为?

4

1 回答 1

0

因为当您执行 $array['foo'] = $array 时,解释器首先将 'foo' 索引添加到 $array 值,然后将新更新的数组放入 $array['foo']。

当您使用中间 $blah 时,您已经存储了在创建 'foo' 键之前未修改的 $array 副本。中间体不会改变行为,它会在创建中间体时存储值的副本,就像它应该做的那样。

于 2013-07-24T00:19:39.727 回答