zoukankan      html  css  js  c++  java
  • php中按值传递和按引用传递的一个问题

      php中传递变量默认是按照值传递。

      简单举个例子:

     1 <?php
     2 
     3 function testArray($arr){// &$arr
     4     $arr = array(1,2,3,);
     5 }
     6 
     7 $array = array(4, 5);
     8 
     9 testArray($array);
    10 
    11 print_r($array);// Array ( [0] => 4 [1] => 5 )

    如果testArray的参数写成$arr,那么数组$array的结果不会变。证明是按照值传递。

    如果参数强制改成引用传递,函数参数要写成&$arr,结果才是Array ( [0] => 1 [1] => 2 [2] => 3 )

    再举一个对象的例子:

     1 <?php
     2 
     3 class Person{
     4     public $age = 0;
     5     function __construct($age)
     6     {
     7         $this->age = $age;
     8     }
     9 }
    10 
    11 function testObj1($p){
    12     $p->age = 2;
    13 }
    14 
    15 function testObj2($p){
    16     $p = null;
    17 }
    18 
    19 function testObj3(&$p){
    20     $p = null;
    21 }
    22 
    23 $p1 = new Person(1);
    24 
    25 echo $p1->age,'<br/>';// 1
    26 
    27 testObj1($p1);
    28 echo $p1->age,'<br/>';// 2
    29 
    30 testObj2($p1);
    31 echo $p1->age,'<br/>';// 2
    32 
    33 testObj3($p1);
    34 echo $p1->age,'<br/>';// null

    对象也依然是按照值传递。这个值是栈区的地址。

    有人会说,为什么按照值传递,28行还会是2。

    如果用个堆栈模型演示一下就很明白了,$p1这个变量是存在栈区,它存放了一块地址,这块地址指向了堆区里的对象。

    此时调用了testObj1()函数,那么会在函数栈里面,再生成一个$p变量,它也存放了一块地址,这个地址和$p1存放的地址相同,表示$p也指向堆区的那个位置。所以说改变$p堆的对象属性,$p1也跟着变。

    当调用testObj2()函数时,它让函数栈区的$p指向了空,但是它并没有改变$p1的指向,$p1仍然指向的那块堆地址。所以仍然是2。

    当调用testObj3()函数时,函数取的是$p1的地址(注意区别,$p1本身在栈里是有个地址的,它存放的数据也是个地址,这两个地址是不一样的),直接操纵了$p1,表示让$p1指向空。因此$p1也就没有了属性值。

    
    
    
  • 相关阅读:
    cf406E Hamming Triples (推公式)
    cf1076E Vasya and a Tree (线段树)
    LOJ2503 NOIP2014 解方程 【HASH】
    vue+antd 解决的rowKey未指定报错Each record in table should have a unique `key` prop,or set `rowKey` to an unique primary key.
    vue 引入第一个elementui组件
    bootstrap导航和table
    垃圾回收jstat术语
    jmap heap 分析
    高内存分析
    expalin精讲
  • 原文地址:https://www.cnblogs.com/firstForEver/p/5244803.html
Copyright © 2011-2022 走看看