PHP &引用类开面试

it2022-05-29  78

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;  明白了吗? 没明白,再好好想想。 当一个变量等于另一个变量的引用的时候,这时任何一方改变了其值,另一方看到的这个值也会变化的。前加本次就表现出来,而后加下一次才会表现出来。

 


最新回复(0)