PHP &引用类开面试

unset知识点:
//unset 只会取消引用  不会销毁内存空间
$a = 1;
$b = &$a;  //$b引用$a  
unset($b);  //取消引用
echo  $a;   //  结果  1
=================================================================
=================================================================
对象引用知识点:
// 对象本身就是引用传递
class person{
      public $name = "xiaomiaomiao";              
}
$p1 = new person();  //实例化person类
$p2 = $p1;   //$p1  赋值  $p2 
$p2->name = "xiaowangwang";  //p2修改name值 不会开辟新空间
=================================================================
PHP引用的一个面试题
<?php
    $data = array(‘a’, ‘b’, ‘c’);
    foreach($data as $key=>$val) {
    $val = &$data[$key];
}
?>
问题1:程序执行时,每一次循环结束后变量$data的值是什么?请解释。
答:第一次循环时,把下标为0的成员,引用赋值给变量$val,$val与$data[0]内容相同,
要是其中一个改变,另一个也改变,此时,$data原样输出,只是$data[0]变成了引用
输出结果 a b c
第二次循环时,$key的值为1,把$data[1]引用复制给$val.
由于$val与$data[0]也是引用关系,所以这时,$val,$data[0],$data[1]三者值同为’B’
$val不再与$data[0]有关系了,只与$data[1]是引用关系
// b  b  c
第三次循环时,$key的值为2,把$data[2]引用复制给$val,
由于$data[1]与$val是引用关系,所以都将改变$data[1]、$val、$data[2]三者值一样
//b c c
问题2:程序执行完后,变量$data的值是什么?请解释。
在第一次循环的时候,$val就被定义成了指向$data['0']的一个引用变量,而foreach的特殊机制在下次循环的时候保留了这个变量与内存地址,所以就把$data[0]和$data[1]覆盖了
答:结果为b c c
============================================================
foreach理解和引用传递
$items = array('a','b','c');
foreach($items as &$v){
 
}
foreach($items as $v){
 
}
print_r($items);//Array ( [0] => a [1] => b [2] => b )
理解:
首先第一个foreach,每次循环都使得当前item的值变成引用,
array(3) { [ 0 ]=> &string(1) "a" [ 1 ]=> string(1) "b" [ 2 ]=> string(1) "c" } 
array(3) { [ 0 ]=> string(1) "a" [ 1 ]=> &string(1) "b" [ 2 ]=> string(1) "c" } 
array(3) { [ 0 ]=> string(1) "a" [ 1 ]=> string(1) "b" [ 2 ]=> &string(1) "c" }
当foreach运行完,得到结果是:
array(3) { [ 0 ]=> string(1) "a" [ 1 ]=> string(1) "b" [ 2 ]=> &string(1) "c" }
 
当执行第二个foreach的时候,每次循环都是把值写入$v引用的地址空间,也就是$items[ 2 ],
array(3) { [ 0 ]=> string(1) "a" [ 1 ]=> string(1) "b" [ 2 ]=> &string(1) "a" } //$items[ 0 ] = a ,写入$items[ 2 ]
array(3) { [ 0 ]=> string(1) "a" [ 1 ]=> string(1) "b" [ 2 ]=> &string(1) "b" } //$items[ 1 ] = b ,写入$items[ 2 ]
array(3) { [ 0 ]=> string(1) "a" [ 1 ]=> string(1) "b" [ 2 ]=> &string(1) "b" } //$items[ 2 ] = &c,是$items[ 2 ]的地址,把它的值(b)取出来写入$items[ 2 ]

============================================================
一道关于php变量引用的面试题
<?php 
$a = 1; 
$x =&$a; 
$b=$a++; 
?> 
问: 
$b和$x的值分别是什么? 
php面试题的答案如下: 
$b = 1; 
$x = 2; 
明白了吗? 没明白,再好好想想。 当一个变量等于另一个变量的引用的时候,这时任何一方改变了其值,另一方看到的这个值也会变化的。前加本次就表现出来,而后加下一次才会表现出来。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值