PHP变量:引用或副本

时间:2011-10-07 18:40:20

标签: php return-by-reference

我对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。升级服务器是不切实际的。

     

期望的结果:

     
      
  1. 如果我忽视它,请解释明显的
  2.   
  3. 这是一个错误吗?有没有解决方法?
  4.   

谢谢!

-Jim

1 个答案:

答案 0 :(得分:2)

您的代码工作正常,没有错误,并且它独立于PHP 4或5.如果只是向您解释这可能会有所帮助。

让我们看一下在你眼中不起作用的例子,看看实际发生了什么:

// step 1
$foo = array(); # 1.
$foostack = array( &$foo ); # 2.
  • 1。:将变量$foo初始化为空数组。
  • 2:您将变量$foostack初始化为数组,并且数组的第一个元素是变量$foo的别名。这与写作完全相同:$foostack[] =& $foo;

进入下一步:

// step 2
$last = array_pop($foostack); # 3.
array_push($last, 'hello'); # 4.
array_push($foostack, &$last); # 5.
  • 3:您将数组$foostack的最后一个元素的分配给$last,然后从数组$foostack中删除最后一个元素。 注意: array_pop会返回一个值,而不是引用。
  • 4:您将'hello'作为新元素添加到$last中的空数组。
  • 5:您将&$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