引用变量 php面试总结1

(1)PHP引用变量

  概念:不同的变量名,访问同一个变量内容,使用&

  知识点:

  使用php函数

  (a)memory_get_usage() 查看内存使用情况

eg

// 定义一个变量
$a = range(0, 1000);
var_dump(memory_get_usage());

运行结果

  (b)xdebug_debug_zval() zval变量容器

eg

// zval变量容器
$a = range(0, 3);
xdebug_debug_zval('a');

运行结果

refcount指在这个空间的变量有1个 is_ref指是否为引用变量 0为不是引用变量,1为是引用变量

  (c) unset 只会取消引用,不会销毁空间

eg

<?php

// unset 只会取消引用,不会销毁空间
$a = 1;

$b = &$a;

unset($b);

echo $a. "\n";

运行结果

过程

   (d)对象不会进行空间的复制,对象本身就是引用传递(要复制需要clone,相关链接https://blog.csdn.net/sinat_29091823/article/details/72637192

eg

<?php

// 对象本身就是引用传递
class Person
{
    public $name = "zhangsan";
}

$p1 = new Person;
xdebug_debug_zval('p1');

$p2 = $p1;
xdebug_debug_zval('p1');

$p2->name = "lisi";
xdebug_debug_zval('p1');

运行结果已经过程

 

  使用PHP引用变量前 eg:

<?php

// 定义一个变量
$a = range(0, 1000);
var_dump(memory_get_usage());

// 定义变量b,将a变量的值赋值给b
// COW Copy On Write
$b = $a;
var_dump(memory_get_usage());

// 对a进行修改
$a = range(0, 1000);
var_dump(memory_get_usage());

 运行结果

过程图

  使用PHP引用变量后 eg:

<?php

// 定义一个变量
$a = range(0, 1000);
var_dump(memory_get_usage());

// 定义变量b,将a变量的值赋值给b
$b = &$a;
var_dump(memory_get_usage());

// 对a进行修改
$a = range(0, 1000);
var_dump(memory_get_usage());

运行结果

过程图

 

 面试题

<?php

/**
 * 写出如下程序的输出结果
 * <?php
 *
 * $data = ['a', 'b', 'c'];
 *
 * foreach($data as $key => $val)
 * {
 *      $val = &$data[$key];
 * }
 * 程序运行时,每一次循环结束后变量$data的值是什么?请解释
 * 程序执行完成后,变量$data的值是什么?请解释
 */

$data = ['a', 'b', 'c'];

foreach ($data as $key=>$val)
{
    $val = &$data[$key];
    var_dump($data);
}

var_dump($data);

 

 

posted @ 2018-06-07 08:25  apesplan  阅读(130)  评论(0编辑  收藏  举报