我对PHP变量引用的工作原理感到困惑。在下面的示例中,我希望能够以$bar[0]
或$barstack[0][0]
的形式访问字符串 hello 。似乎在步骤1中通过引用传递数组应该足够了。
第二个例子不起作用。 $foostack[0]0]
是字符串 hello ,但$foo[0]
不存在。在某些时候,$ foostack的第一个元素变成$ foo的副本,而不是引用。
问题在于第2步的第一行:当我按下引用时,我希望关闭引用。但array_pop
会返回副本。
其他人告诉我,如果我不得不担心引用和副本,那么PHP对我来说不是正确的语言。这可能是我将得到的最佳答案。
FWIW,为了使var_dump
有用,它需要显示一些区分引用和副本的属性。它不是。也许还有其他功能?
我的第一个PHP项目似乎很糟糕。有人可以帮助解释一下 这段代码有问题吗?
<?php
echo "// This works!\n<br />" ;
// step 1
$bar = array() ;
$barstack = array( &$bar ) ;
// step 2
array_push( $barstack[0], 'hello' ) ;
// results
echo count( $barstack[0] ) .';' .count( $bar ) ;
echo "\n<br />// This doesn't :(\n<br />" ;
// step 1
$foo = array() ;
$foostack = array( &$foo ) ;
// step 2
$last = array_pop( $foostack ) ;
array_push( $last, 'hello' ) ;
array_push( $foostack, &$last ) ;
// results
echo count( $foostack[0] ) .';' .count( $foo ) ;
echo "\n<br />// Version:\n<br />" ;
echo phpversion() ."\n" ;
?>
可以在以下网址查看结果:
http://www.gostorageone.com/tqis/hi.php
版本是4.3.10。升级服务器是不切实际的。
期望的结果:
- 如果我忽视它,请解释明显的
- 这是一个错误吗?有没有解决方法?
醇>
谢谢!
-Jim
答案 0 :(得分:2)
您的代码工作正常,没有错误,并且它独立于PHP 4或5.如果只是向您解释这可能会有所帮助。
让我们看一下在你眼中不起作用的例子,看看实际发生了什么:
// step 1
$foo = array(); # 1.
$foostack = array( &$foo ); # 2.
$foo
初始化为空数组。$foostack
初始化为数组,并且数组的第一个元素是变量$foo
的别名。这与写作完全相同:$foostack[] =& $foo;
进入下一步:
// step 2
$last = array_pop($foostack); # 3.
array_push($last, 'hello'); # 4.
array_push($foostack, &$last); # 5.
$foostack
的最后一个元素的值分配给$last
,然后从数组$foostack
中删除最后一个元素。 注意: array_pop
会返回一个值,而不是引用。'hello'
作为新元素添加到$last
中的空数组。&$last
作为新元素添加到$foostack
; 那么我们现在有哪些变量?
$foo
只包含一个空数组。 $foostack
的最后一个元素曾经引用它(2.),但是你在(3.)之后直接删除了它。由于$foo
并且它的值不再被更改,它只是一个空数组array()
。$last
,它在3中得到一个空数组。这只是一个空数组,它是一个值而不是引用。在(4.)中,将字符串'hello'
添加为第一个元素。 $last
是一个包含一个字符串元素的数组。$foostack
。它是一个数组,它引用(2.)中的$foo
,然后在(3.)中删除该引用。最后,添加了$last
的别名。这正是代码的其余部分输出的内容:
echo count($foostack[0]) .';'. count($foo);
$foostack[0]
是$last
的别名 - 字符串'hello'
作为唯一元素的数组,而$foo
只是$foo
,空数组{ {1}}。
如果使用PHP 4或5执行该操作,则没有任何区别。
当你写“错误”时,我认为你无法达到你想要的效果。您可能正在寻找能够在删除数组之前将引用返回到数组的最后一个元素的函数。我们称之为函数array()
:
array_pop_ref()
// step 1
$foo = array();
$foostack = array( &$foo );
// step 2
$last =& array_pop_ref($foostack);
array_push($last, 'hello');
array_push($foostack, &$last);
// results
echo count($foostack[0]) .';' .count($foo); # 1;1
功能:
array_pop_ref