php数组时按值传递还是按地址传递
php数组时按值传递还是按地址传递
一、总结
1、数组都是按值:php普通变量和数组的赋值(=)是按值传递,对象的赋值(=)是按址传递
2、对象和按值和按址:对象的clone(用clone关键字)是按值传递
二、PHP 数组的拷贝是按值传递 or 按引用传递
在记忆中 PHP 简单变量的拷贝是按值传递,数组和对象的拷贝是按引用传递,即通过引用来实现。
简单变量和对象好理解:
<?php// 简单变量的拷贝 $a = 'human'; $b = $a; $b = 'cat'; var_dump($a); // string 'human' (length=5)// 对象的拷贝 class A{} $a = new A(); $b = $a; $b->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:http://php.net/manual/zh/function.next.php
current:http://php.net/manual/zh/function.current.php)
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' ;
|
参考:
php基础语法之数组和数组指针
php中引用&的真正理解-变量引用、函数引用、对象引用
Programming PHP 3rd Edition
参考:
PHP 数组的拷贝是按值传递 or 按引用传递 - 黄棣-dee - 博客园
https://www.cnblogs.com/dee0912/p/5605323.html
转载于:https://www.cnblogs.com/Renyi-Fan/p/8995785.html
php数组时按值传递还是按地址传递相关推荐
- c++builder传递参数_参数按值传递和按地址传递过程中,指向内存的指针如何变化?...
大家好,我们今日继续讲解VBA代码解决方案的第125讲内容:关键字ByVal和ByRef的作用.在上一节中我们讲到了形式参数和实际参数的定义,同时讲到了从实际参数传递给形式参数的过程中按值传递和按地址 ...
- 按值传递按引用传递按地址传递
按值传递:不改变外部对象 按引用传递&&按地址传递:允许改变外部对象 #include <iostream> #include <cstdlib> #inclu ...
- c++ 按值传递(Byval) 和 按地址传递(ByRef)
在接触了这么多的编程语言后,似乎每个语言都要涉及到参数的传递,而参数传递过程中的两种传递方式: ①按值传递 ②按地址传递 学到现在了,仔细想想还是很模糊,从开始接触C++中的参数传递,只知道有这么个东 ...
- 函数中参数有数组时注意的小问题(不一定要传递数组长度,不用返回数组,可以在函数中改变数组元素值)
函数中参数有数组时注意的小问题: 1.不一定要传递数组长度 2.不用返回数组,可以在函数中改变数组元素值 通过下面这个小例子来验证: #include<iostream> #include ...
- 使用C语言将一个数组首尾互换后输出,函数实现体会地址传递
将一个数组首尾互换后输出,函数实现体会地址传递 小伙伴多多支持,有意见进行评论!(づ ̄3 ̄)づ╭❤- 运行结果: #include<stdio.h> #define N 6 void co ...
- php数组地址,怎么实现javascript数组与php数组的地址传递
怎么实现javascript数组与php数组的地址传递 发布时间:2020-12-10 15:31:30 来源:亿速云 阅读:56 作者:Leah 怎么实现javascript数组与php数组的地址传 ...
- 关于C++传递数组时初始化注意事项(允悲)
关于C++传递数组时初始化注意事项(允悲) int a[N][N]; void fun(int arr[N][N]){//printf("%d\n",sizeof(arr)) = ...
- 值传递 和 地址传递 的区别(好多句话才可以说清)
要知道什么是**值传递**和**地址传递**,首先要知道什么是**基本数据类型**和**引用类型**. Java的基本数据类型就八种(除了这八种之外都是引用类型):◆整型:byte(8位) short ...
- Java中,String类型和包装类型作为参数传递时,是属于值传递还是引用传递呢?...
<Java中,String类型和包装类型作为参数传递时,是属于值传递还是引用传递呢?> <Java中的值传递和引用传递> 原理知识: 如果参数类型是原始类型,那么传过来的就是这 ...
最新文章
- MMA冠军Rory MacDonald:比特币现金(BCH)是真正的比特币
- Java Spring Boot 2.0 实战之制作Docker镜像并推送到Docker Hub和阿里云仓库
- 什么是“软件架构设计”(推荐)
- 【转】别人整理的DP大全
- 和lua的效率对比测试_Unity游戏开发Lua更新运行时代码!
- 报名即将截止,“梧桐杯”大数据应用创新大赛,邀你进入大数据先锋阵营
- 4 合并grid列_Grid教程
- POJ1769(线段树+DP)
- jQuery DOM操作之查找结点
- 论文笔记_S2D.02-2013-CVPR-结合三维场景重建和类别分割
- 【Git/Github学习笔记】GitHub上README写法暨GFM语法解读
- python+grpc+yolo 目标检测实践
- turnserver.conf文件详解
- Mesh平滑处理的几种算法比较
- 离散数学知识点总结(5):蕴含式;命题的推理理论;逻辑推演的方法;推理的有效性证明
- Material Design-Surface平面第二篇
- 茶文化入门 --茶分类
- 分销APP联盟商家入驻商城系统开发
- Optimizing radiotherapy plans for cancer treatment with Tensor Networks解读
- 香港公司--离岸帐户现金
热门文章
- 1.小象笔记--汇率换算
- 人工客服 计算机英语怎么说,人工服务用英文怎么说? 电话上的。。。谢谢
- Pandas分组统计函数:groupby、pivot_table及crosstab
- 分组统计group by
- Looper 需要手动 quit,那主线程 Looper 呢?
- 自动出题机c语言compute,小学数学自动出题工具下载-幼儿园小学数学自动出题机下载v2.0-西西软件下载...
- KSDK2.0 + Pins Tool 体验
- html css js题目
- pdfplumber读取PDF文本内容时出现cid字符
- 转——解决游戏王DL的steam版锁区问题