首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PHP中的数组是作为值复制还是作为对新变量的引用复制,并在传递给函数时使用?

PHP中的数组是作为值复制还是作为对新变量的引用复制,并在传递给函数时使用?
EN

Stack Overflow用户
提问于 2010-01-09 05:32:25
回答 5查看 134.3K关注 0票数 288

1)当数组作为参数传递给方法或函数时,它是通过引用传递还是通过值传递?

2)将数组赋值给变量时,新变量是对原始数组的引用,还是新的副本?

这样做如何:

代码语言:javascript
复制
$a = array(1,2,3);
$b = $a;

$b是对$a的引用吗

EN

回答 5

Stack Overflow用户

发布于 2012-03-16 23:56:30

关于你的第一个问题,数组是通过引用传递的,除非它在你调用的方法/函数中被修改了。如果您尝试修改方法/函数中的数组,则会首先创建数组的副本,然后只修改副本。这使得该数组看起来像是通过值传递的,而实际上并非如此。

例如,在第一种情况下,即使您没有将函数定义为通过引用接受$my_array (通过在参数定义中使用&字符),它仍然通过引用传递(即:您不会因为不必要的副本而浪费内存)。

代码语言:javascript
复制
function handle_array($my_array) {  

    // ... read from but do not modify $my_array
    print_r($my_array);

    // ... $my_array effectively passed by reference since no copy is made
}

但是,如果修改该数组,则会首先创建该数组的副本(这会使用更多内存,但不会影响原始数组)。

代码语言:javascript
复制
function handle_array($my_array) {

    // ... modify $my_array
    $my_array[] = "New value";

    // ... $my_array effectively passed by value since requires local copy
}

仅供参考-这被称为“懒惰复制”或“写入时复制”。

票数 141
EN

Stack Overflow用户

发布于 2010-01-09 05:36:34

当数组传递给PHP中的方法或函数时,它是通过值传递的,除非您显式地通过引用传递它,如下所示:

代码语言:javascript
复制
function test(&$array) {
    $array['new'] = 'hey';
}

$a = $array(1,2,3);
// prints [0=>1,1=>2,2=>3]
var_dump($a);
test($a);
// prints [0=>1,1=>2,2=>3,'new'=>'hey']
var_dump($a);

在您的第二个问题中,$b不是对$a的引用,而是$a的副本。

与第一个示例非常相似,您可以通过执行以下操作引用$a

代码语言:javascript
复制
$a = array(1,2,3);
$b = &$a;
// prints [0=>1,1=>2,2=>3]
var_dump($b);
$b['new'] = 'hey';
// prints [0=>1,1=>2,2=>3,'new'=>'hey']
var_dump($a);
票数 5
EN

Stack Overflow用户

发布于 2019-05-15 07:18:38

为了扩展其中一个答案,多维数组的子数组也是通过值传递的,除非通过引用显式传递。

代码语言:javascript
复制
<?php
$foo = array( array(1,2,3), 22, 33);

function hello($fooarg) {
  $fooarg[0][0] = 99;
}

function world(&$fooarg) {
  $fooarg[0][0] = 66;
}

hello($foo);
var_dump($foo); // (original array not modified) array passed-by-value

world($foo);
var_dump($foo); // (original array modified) array passed-by-reference

结果是:

代码语言:javascript
复制
array(3) {
  [0]=>
  array(3) {
    [0]=>
    int(1)
    [1]=>
    int(2)
    [2]=>
    int(3)
  }
  [1]=>
  int(22)
  [2]=>
  int(33)
}
array(3) {
  [0]=>
  array(3) {
    [0]=>
    int(66)
    [1]=>
    int(2)
    [2]=>
    int(3)
  }
  [1]=>
  int(22)
  [2]=>
  int(33)
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2030906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档