//
不执行
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)