background image

          

//

不执行

Separation

        ... ; //process

  }

?>

(3)

两种方式到底怎样使用,啥时候使用

?

<?php
   $var = "laruence";
   $var_dup = $var;
   $var_ref = &$var;
?>
对于上面的代码,存在一对

copy on write 的变量$var 和$var_dup, 又有一对

change on write 机制的变量对$var 和$var_ref,这个情况又是如何运作的呢?

当第二行执行的时候,和前面讲过的一样,

$var_dup 和 $var 指向相同的 zval, 

refcount 为 2。

当执行第三行的时候,

PHP 发现要操作的 zval 的 refcount 大于 1,则,PHP 会执行

Separation, 将$var_dup 分离出去,并将$var 和$var_ref 做 change on write 关联。
也就是,

refcount=2, is_ref=1。

(4)

数值巨大变量处理

当然如果我们在

php 中进行参数传递的时候,是否有必要对传递内容巨大的数组心存

警惕

,担心内存的大量流失?
<?php

function countChina($persons)
{

$count=0;
foreach($persons as $person)
{

if($person['nation'] == 'china')
$count++;

}
return $count;

}

?>
例如上面这段统计一群人中有多少个中国国籍的时候

,如果有一个 10W 的人的数组要

传进去

,你是否会担心被复制后传到函数里,导致内存占用瞬间翻倍?也许你会在参数那

里加一个

&表示引用?

php 的设计者在这里有一个很巧妙的设计,引入了一个 copy on write 的概念,在上面
的函数中

,如果你不去修改$perons 对象的内容,并不会有复制行为发生,内存也不会

double.

但是如果我想在函数里面修改数据

,便于函数后面的处理,这个时候内存会 double 吗?

如下

:

<?php

function countChina($persons)