PHP引用賦值


<?php
/**
 * 在PHP 中引用的意思是用不同的名字訪問同一個變量內容
 * 只有有名字的變量才可以引用賦值,否則會報錯
 * 引用賦值 不是在內存上同體,只是把各自的值關聯起來
 * unset不會導致所有引用變量消失
 */
    $a = 10;
    $b = &$a; // 引用賦值
    echo $b,'<hr>'; // 10

    function test(){
        return 20;
    }

    $b = &test();
    echo $b,'<hr>'; // 20

    function &test2(){
        return 30; // 30
    }

    $b = test2();
    echo $b,'<hr>';

    unset($a);
    echo $b;

    // 函數的傳址調用
    function test3(&$a)
    {
        $a +=100;
    }
    $b=1;
    echo $b;//輸出1
    test3($b); //這里$b傳遞給函數的其實是$b的變量內容所處的內存地址,通過在函數里改變$a的值 就可以改變$b的值了
    echo "<br>";
    echo $b;//輸出101

    // 函數的引用返回
    function &test4()
    {
        static $b = 0;//申明一個靜態變量
        $b = $b + 1;
        echo $b;
        return $b;
    }
    $a=test4();//這條語句會輸出 $b的值 為1
    $a=5;
    $a=test4();//這條語句會輸出 $b的值 為2
    $a=&test4();//這條語句會輸出 $b的值 為3
    $a=5;
    $a=test4();//這條語句會輸出 $b的值 為6

    /*
        通過這種方式$a=test();得到的其實不是函數的引用返回,這跟普通的函數調用沒有區別
        PHP規定通過$a=&test(); 方式得到的才是函數的引用返回
        至於什么是引用返回呢(PHP手冊上說:引用返回用在當想用函數找到引用應該被綁定在哪一個變量上面時。) 這句狗屁話 害我半天沒看懂
        用上面的例子來解釋就是
        $a=test()方式調用函數,只是將函數的值賦給$a而已, 而$a做任何改變 都不會影響到函數中的$b
        而通過$a=&test()方式調用函數呢, 他的作用是 將return $b中的 $b變量的內存地址與$a變量的內存地址 指向了同一個地方
        即產生了相當於這樣的效果($a=&b;) 所以改變$a的值 也同時改變了$b的值 所以在執行了
        $a=&test();
        $a=5;
        以后,$b的值變為了5
        這里是為了讓大家理解函數的引用返回才使用靜態變量的,其實函數的引用返回多用在對象中
    */

// 對象的調用

class a{
    var $abc="ABC";
}
$b=new a;
$c=$b;
echo $b->abc;//這里輸出ABC
echo $c->abc;//這里輸出ABC
$b->abc="DEF";
echo $c->abc;//這里輸出DEF
/*
在PHP中,對象的復制是通過引用來實現的。

上列中$b=new a; $c=$b; 其實等效於$b=new a; $c=&$b;

PHP中默認就是通過引用來調用對象, 但有時你可能想建立一個對象的副本,並希望原來的對象的改變不影響到副本。

為了這樣的目的,PHP定義了一個特殊的方法,稱為__clone.

引用的作用

如果程序比較大,引用同一個對象的變量比較多,並且希望用完該對象后手工清除它時使用 "&" 方式,然后用$var=null的方式清除。

另外,php中對於大數組的傳遞,建議用 "&" 方式,可以節省內存空間使用。

取消引用

當你 unset 一個引用,只是斷開了變量名和變量內容之間的綁定。這並不意味着變量內容被銷毀了。
 */
 

 案例:

 <?php
    
     $data = ['a', 'b', 'c'];
    
     foreach($data as $key => $val)
     {
          $val = &$data[$key];
     }
     var_dump($data);
     /**
      * $key 0  $val = a             $val = &$data[0]
      *
      * $key 1  $val = $data[0] = b  $val = &data[1]
      *
      * $key 2  $val = $data[1] = c  $val = &data[2]
      *
      * 輸出 b c c
      */

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM