博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php数组时按值传递还是按地址传递
阅读量:5889 次
发布时间:2019-06-19

本文共 2191 字,大约阅读时间需要 7 分钟。

php数组时按值传递还是按地址传递

一、总结

1、数组都是按值:php普通变量和数组的赋值(=)是按值传递,对象的赋值(=)是按址传递

2、对象和按值和按址对象的clone(用clone关键字)是按值传递 

 

二、PHP 数组的拷贝是按值传递 or 按引用传递

在记忆中 PHP 简单变量的拷贝是按值传递,数组和对象的拷贝是按引用传递,即通过引用来实现。

简单变量和对象好理解:

name = 'jack';var_dump($a); // object(A)[1] public 'name' => string 'jack' (length=4)

对象 $a 和 对象 $b 的内存地址指向了同一个地方,即针对 $a 和 $b 所做的操作都针对同一个实例。

PHP 中可以通过 clone 关键字按值拷贝对象:clone关键字让对象按值传递,因为clone就是拷贝

1
2
3
4
5
6
7
8
9
10
<?php
 
class 
A{
    
public 
$name 
'Vardy'
;
}<br>
$a 
new 
A();
$b 
clone 
$a
;
$b
->name = 
'dee'
;
var_dump(
$a
); 
// object(A)[1] public 'name' => string 'Vardy' (length=5)
var_dump(
$b
); 
// object(A)[2] public 'name' => string 'dee' (length=3)

  

数组:

1
2
3
4
5
6
7
8
9
10
<?php
 
// 数组的拷贝
$a 
= [
'human'
'orc'
];
$b 
$a
;
$b
[0] = 
'elve'
;
var_dump(
$a
);
// array (size=2)
//   0 => string 'human' (length=5)
//   1 => string 'orc' (length=3)

这样看,数组的拷贝是按值传递的.

 

另一个例子 数组的迭代器:

1
2
3
4
5
6
7
8
9
<?php
 
$a 
= [
'human'
'orc'
'elven'
'undead'
];
next(
$a
);
 
$b 
$a
// 此时指针位置也随着数组的复制而复制
 
var_dump(current(
$a
)); 
// string 'orc' (length=3)
var_dump(current(
$b
)); 
// string 'orc' (length=3)

当数组拷贝时,数组的指针位置也随着复制。

(next:

current:)

 

1
2
3
4
5
6
7
8
9
10
<?php
 
$a 
= [
'human'
'orc'
'elven'
'undead'
];
end
(
$a
);
next(
$a
); 
// 数组指针非法,返回 FALSE
 
$b 
$a
;
 
var_dump(current(
$a
)); 
// string 'human' (length=5)
var_dump(current(
$b
)); 
// boolean false

当数组在拷贝前,指针的位置是非法时,拷贝后分别打印两个数组指针所指向的当前单元时,出现了不一样的情况。

原因是数组变量发生拷贝后,两个变量中先发生写操作的,其指针被初始化,即指向第一个元素,而 current 方法也会产生写操作,因此 $a 的数组指针当前指向的是 'human',而 $b  current 方法则返回 FALSE。

 

以下代码同理, $b 首先发生了写操作:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
 
$a 
= [
'human'
'orc'
'elven'
'undead'
];
end
(
$a
);
next(
$a
);
 
$b 
$a
;
 
$b
[] = 
'dwarf'
;
 
var_dump(current(
$a
)); 
// boolean false
var_dump(current(
$b
)); 
// string 'human' (length=5)

  

解析:数组的拷贝是值传递。PHP 在管理内存方面有一个机制叫写时复制(COW,Copy On Write),保证了变量间复制值不浪费内存:当一个变量的值复制到另一个变量时,PHP 没有为复制值使用更多的内存,相反,它会更新符号表来说明两个变量拥有相同的内存块,所以当执行下面的代码时并没有创建一个新的数组:

1
2
3
4
<?php
 
$a 
= [
'human'
'orc'
'elven'
'undead'
];
$b 
$a
;

当修改了 $a 或 $b 任意一个副本时,PHP 将分配所需的内存来进行复制:

1
$b
[] = 
'dwarf'
;

  

 

 

参考:

Programming PHP 3rd Edition

 

参考:

PHP 数组的拷贝是按值传递 or 按引用传递 - 黄棣-dee - 博客园

https://www.cnblogs.com/dee0912/p/5605323.html

 

你可能感兴趣的文章
使用REST-Assured对API接口进行自动化测试
查看>>
GitHub发布史上最大更新,年度报告出炉!
查看>>
王潮歌跨界指导HUAWEI P20系列发布会 颠覆传统 眼界大开!
查看>>
王高飞:微博已收购一直播 明年一季度重点是功能与流量打通
查看>>
趣头条发行区间7至9美元 预计9月14日美国上市
查看>>
新北市长侯友宜:两岸交流应从隔壁最亲近的人开始
查看>>
全面屏的Nokia X即将上线,不到2000元的信仰你要充值吗?
查看>>
HTML5音频audio属性
查看>>
ES6学习
查看>>
Centos7搭建Django环境
查看>>
序列化一个Intent
查看>>
JavaScript数据类型及语言基础--ife
查看>>
进阶 Nginx 高手必须跨越的 5 座大山
查看>>
部署P2P升级的脚本
查看>>
jenkins--ant持续集成测试build文件脚本 测试报告
查看>>
ubuntu下安装libxml2
查看>>
nginx_lua_waf安装测试
查看>>
easyui 只刷新当前页面的数据 datagrid reload 方法
查看>>
58到家完成3亿美金A轮融资 阿里平安等投资
查看>>
Mysql-mmm高可用方案安装及配置
查看>>