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

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

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

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

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

这样做如何:

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

$b是对$a的引用吗

EN

回答 5

Stack Overflow用户

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

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

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

代码语言:javascript
运行
AI代码解释
复制
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
运行
AI代码解释
复制
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-08 21:36:34

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

代码语言:javascript
运行
AI代码解释
复制
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
运行
AI代码解释
复制
$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-14 23:18:38

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

代码语言:javascript
运行
AI代码解释
复制
<?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
运行
AI代码解释
复制
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

复制
相关文章
答网友问:golang中的slice作为函数参数时是值传递还是引用传递?
今天有网友问通道和切片在赋值给另一个变量或作为函数参数传递的时候是不是引用传递?因为老师在讲解的时候说是指针传递?
Go学堂
2023/08/29
7680
答网友问:golang中的slice作为函数参数时是值传递还是引用传递?
PHP 函数传值和传引用的区别
传值 : 默认情况下, 函数参数通过值传递, 所以即使在函数内部改变参数的值也不会改变函数外部的值
很酷的站长
2023/01/08
3.2K0
PHP 函数传值和传引用的区别
PHP函数传值与传引用
1. 函数参数为对象时,传递的是对象地址,并非对象的拷贝 class Person{ public function __construct($name){ $this->name = $name; } } $aman = new Person('man'); function change( $p){ $p->name = 'lucy'; } change($aman); echo $aman->name; //lucy 2. 函数参数为对象以外的普通类型时,包括数
botkenni
2022/01/10
3.8K0
python传参是传值还是传引用
在此之前先来看看变量和对象的关系:Python 中一切皆为对象,数字是对象,列表是对象,函数也是对象,任何东西都是对象。而变量是对象的一个引用(又称为名字或者标签),对象的操作都是通过引用来完成的。例如,a = []是一个空列表对象,变量 a 是该对象的一个引用 例1 def test(c): c.append("hello world") print(c,id(c)) return list = [1,2] test(list) print(list,id(list)) 输出 [1, 2, 'hel
用户1679793
2018/04/28
3.6K0
Python函数参数传递:传值还是传引用
猜猜结果应该是什么? 按照C++语言的思维,如果Python函数参数的传递是传值的话,结果应该是[0, 1],如果是传引用的话,结果应该是[‘T’, ‘Z’, ‘Y’]。 可是实际结果是:[0, 1, 100]。所以,Python函数参数的传递既不是所谓的传值也不是传引用。
卡尔曼和玻尔兹曼谁曼
2019/01/22
3.3K0
Python函数参数传递:传值还是传引用
Python 传值还是传引用
如果 node =None,相当于node指向一个不可变对象,在调用insert函数时,仅传值。
birdskyws
2018/09/12
2.3K0
每天学点 Go 规范 - 函数传参时,struct 应该传值还是引用
现在团队里几乎所有的代码都需要经过 Code Review(代码审查)之后才允许合入主分支。笔者在 CR 中看到了不少不适合的问题,也看到了不少值得学习的点,于是决定一点一滴地记录这些做法、经验、教训,以飨读者。如有错误,也欢迎读者不吝指正。
amc
2023/08/25
1.1K0
每天学点 Go 规范 - 函数传参时,struct 应该传值还是引用
go语言中函数参数传值还是传引用的思考
算起来这些年大大小小也用过一些不同编程语言,但平时开发还是以C++为主,得益于C++精确的语义控制,我可以在编写代码的时候精准地控制每一行代码的行为,以达到预期的目的。但是C++的这种强大的语义控制,就带来了极多的概念和极大的学习成本,几乎逼着使用者不得不去了解该语言中的所有细节行为,以防出现意料之外的情况。新时代的语言如golang等,较之C++就好比美图秀秀对比photoshop(绝非贬义),同样都提供了修图的功能,但是前者屏蔽了诸多细节,更傻瓜式且易于使用,一样能达到好的效果;而后者则提供了更多专业的编辑手段,能够满足更精细化更底层的需求,但是随之而来的就是巨大的学习成本。显然两者各有优劣,但是对当今快速发展的互联网来说,以golang为代表的新时代语言更加能够适应敏捷开发的模式,比较起来,C++这些前辈还是“太重”了。
tyriqchen
2019/04/22
4.7K0
【Kotlin】函数 ⑧ ( 函数引用 作为函数参数 | ::函数名 | 函数类型 作为函数返回值类型 )
函数引用 可以将 具名函数 转为 函数的参数值 , 只要可以使用 Lambda 表达式 参数的地方 , 就可以使用 函数引用 进行替代 ;
韩曙亮
2023/03/30
2.9K0
【Kotlin】函数 ⑧ ( 函数引用 作为函数参数 | ::函数名 | 函数类型 作为函数返回值类型 )
Android Studio复制项目作为一个新的工程
 Failed to finalize session : INSTALL_FAILED_INVALID_APK: Split lib_slice_4_apk was defined multiple times
杨奉武
2018/08/15
1.2K0
Android Studio复制项目作为一个新的工程
Go语言参数传递是传值还是传引用
其实对于传值和传引用,是一个比较古老的话题,做研发的都有这个概念,但是可能不是非常清楚。对于我们做Go语言开发的来说,也想知道到底是什么传递。
飞雪无情
2018/08/28
2.3K0
Go语言参数传递是传值还是传引用
Map复制给新Map时,用 “=、clone、还是putAll”?论Map的深复制和浅复制
在我们最初使用map复制开发业务代码时,通常会踩到深浅复制(拷贝)这个坑里,比如我,在Map复制时 (如:Map<String, String> new_Map = old_Map) 出现过以下两类问题:
陈哈哈
2020/07/03
4.6K0
PHP笔记:变量传值,值传递和引用传递的区别
变量传值在开发中经常会遇到,主要有两种方式:值传递和引用传递,下面通过一个示例来说明两者的区别。
德顺
2019/11/13
3.2K0
PHP笔记:变量传值,值传递和引用传递的区别
C语言定义数组时使用枚举作为数组的下标
昨天写代码被人告知还有这种写法,很神奇。通常情况下定义数组都是顶一个什么类型的数组然后下标或者脚标就是从0开始++++
用户4645519
2020/09/07
3.5K0
Vue 中,如何将函数作为 props 传递给组件
作者:Michael Thiessen 译者:前端小智 来源:medium 点赞再看,养成习惯本文 GitHub https://github.com/qq44924588... 上已经收录,更多往
前端小智@大迁世界
2020/05/18
8.3K0
Golang 中函数作为值与类型
在 Go 语言中,我们可以把函数作为一种变量,用 type 去定义它,那么这个函数类型就可以作为值传递,甚至可以实现方法,这一特性是在太灵活了,有时候我们甚至可以利用这一特性进行类型转换。作为值传递的条件是类型具有相同的参数以及相同的返回值。
张乘辉
2019/06/14
1.7K0
python 变量传值传引用 区分
python的变量都可以看成是内存中某个对象的引用。(变量指向该内存地址存储的值)
IT工作者
2022/07/29
1.6K0
c++中引用作为返回值
引用的意义: 引用可以看作某个变量的“别名”,作为某个变量的别名而存在,因此在一些场合可以代替指针。 引用相对于指针来说具有更好的可读性和实用性,能起到指针的部分作用,但是比指针安全。 引用在c++里面可以说是一把利器,引用用的好的话可以写出非常精妙的程序。 引用的本质: 引用在C++中的内部实现是一个常指针。 Type& name çè Type* const name C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同。 从使用的角度,引用会让人误会其只是一个别
混说Linux
2022/07/14
6740
Python学习笔记之函数参数传递 传值还是传引用
在学完Python函数那一章节时,很自然的的就会想到Python中函数传参时传值呢?还是传引用?或者都不是? 
Jetpropelledsnake21
2019/02/15
1.9K0
点击加载更多

相似问题

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

83

返回的数组是按值复制还是在MATLAB中作为引用返回?

15

包含数组作为引用的Bash复制变量

116

作为参数传递给函数的jQuery对象是否是值复制而不是引用?

20

CouchDB的复制DB是对原件的复制还是引用?

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文