php值传递和引用传递实例和值传递的区别

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

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

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

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

简单變量和对象好理解:

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

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

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

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

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

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

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

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

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

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

值传递:函数范围内对值的任何妀变在函数外部都会被忽略

值传递和引用传递实例:函数范围内对值的任何改变在函数外部也能反映出这些修改

A:按值传递时php必须复制值。特别是对于大型的字符串和对象来说这将会是一个代价很大的操作。

B.按值传递和引用传递实例则不需要复制值对于性能提高很有好處。

我要回帖

更多关于 值传递和引用传递实例 的文章

 

随机推荐