關於php中物件傳值方式的詳解

2020-07-16 10:05:48

變數賦值與物件賦值對比

 <?php 
     // 宣告一個變數並賦值 
     $a = 1; 
     // 將資料型別的值 賦值 給一個變數 
     $b = $a; 
  
     // 修改$a的值 
     $a = 2; 
     // $a和$b是兩個獨立的記憶體空間修改其中一個另一個不受影響
     echo $b; // 1 
 
     class Person
    {
         public $name;
         public $age;
    }
     // 將物件型別的資料 賦值 給一個變數
     $p = new Person;
     // 通過對屬性修改值,來確定物件導向中 物件的傳值方式
     $p->name = 'jesse';
     // 若是成功修改值,則是參照傳值 
     echo $p->name; // jesse

 ?>

案例解釋:

在這裡通過變數的賦值方式 與 物件的賦值方式方式相對比,程式碼第5行中的賦值方式為「拷貝賦值」,故在修改其源值($a的值)的情況下,$b的值不受影響。$a與$b的記憶體關係圖如下:

對象-2.jpg

而程式碼20行將資料型別賦值給$p變數,通過$p修改物件內部的值成功,對比變數的傳值方式,證明這是參照傳值,記憶體關係圖如下:

對象-3.jpg

而程式碼20行將資料型別賦值給$p變數,通過$p修改物件內部的值成功,對比變數的傳值方式,證明這是參照傳值,記憶體關係圖如下:

<?php 
    class Person
    {
        public $name;
        public $age;
        // 將物件型別的資料 賦值 給一個變數
         $p = new Person;
         // 通過對屬性修改值,來確定物件導向中 物件的傳值方式
        $p->name = 'jesse';
        // 將物件賦予另一變數
        $m = $p;
        // 另一變數修改屬性值
        $m->name = 'Marry';
         // 輸出源變數 賦值變數存取內部屬性的結果
        echo $p->name, $m->name;
    }
?>

第12行程式碼為本篇文章的最「點睛」的程式碼,等號右邊為是一個物件,左邊是一個變數,那麼犀利的問題來了,$m是將物件拷貝一份?還是按參照傳遞呢?該程式碼記憶體關係如下:

對象-4.jpg

所以,最後兩個物件的屬性值均被修改為Marry!!!

那按參照傳值會是怎麼個情況?

 <?php 
     class Person
     {
         public $name; 
         public $age; 
     } 
     // 將物件型別的資料 賦值 給一個變數 
     $p = new Person; 
     // 通過對屬性修改值,來確定物件導向中 物件的傳值方式
     $p->name = 'jesse';
     // 將物件賦予另一變數
     $m = &$p;
     // 另一變數修改屬性值
     $m->name = 'Marry';
     // 輸出源變數 賦值變數存取內部屬性的結果
     echo $p->name, $m->name;
 ?>

對象-5.jpg

更多相關內容請存取PHP中文網:PHP視訊教學

以上就是關於php中物件傳值方式的詳解的詳細內容,更多請關注TW511.COM其它相關文章!