变量

  $a = 1

  echo memory_get_usage(), '<br />';   //  119632

  $b = $a

  echo memory_get_usage(), '<br />';   //  119680

  $a = 1;

   echo memory_get_usage(), '<br />';   //  119712

$a和 $b都指向$a的内存地址,并不会copy一块内存地址出来,因为COW(copy on writer),只有再对$a进行赋值的时候$b才能新创建一块内存地址,所以内存增加。

   $b = &$a 

  echo memory_get_usage(), '<br />';   //  119712

$a和$b指向一个内存地址,再对$a进行修改也不会创建新的内存地址,如果unset($b)那么之后消除$b对$a的引用,并不会把$a指向的内存地址给消除了

对象

class Person{

            public $Name = “张三”;

}

    $d = new Person();
    $e = $d;
    $d->name = "zhamgsan";
?>

此时$b和$a都同时指向一个内存地址,对$a 进行修改$a->Name = "李四"后  $a$b还是指向一块地址。

练习

$data = [a,b,c]

foreach($data as $k=>$v){

        $v = &$data[$k]

}

程序运行一遍后 $data打印出来是多少?

PHP----引用

第一次循环 $k = 0  $v =  a 循环体内  $v = &$data[0] = a                   ==>  a,b,c

第二次循环 $k = 1 $v  = b 因为$v变化,$v = &$data[0], 所以$data[0] = b ,循环体内 $v = &$data[1] = b     ===> b,b,c

第三次循环  $k= 2 $v  = c 同上$v变化 ,$v = &$data[1],所以$data[1] = c,循环体内$v= &$data[2] = c===>b,c,c

相关文章: