PHP面向對象之對象傳值方式


 1 <?php  2 // 聲明一個變量並賦值  3 $a = 1;  4 // 將數據類型的值 賦值 給一個變量  5 $b = $a;  6  7 // 修改$a的值  8 $a = 2;  9 // $a和$b是兩個獨立的內存空間修改其中一個另一個不受影響 10 echo $b; // 1  11 12 class Person 13  { 14 public $name; 15 public $age; 16  } 17 // 將對象類型的數據 賦值 給一個變量 18 $p = new Person; 19 // 通過對屬性修改值,來確定面向對象中 對象的傳值方式 20 $p->name = 'jesse'; 21 // 若是成功修改值,則是引用傳值  22 echo $p->name; // jesse 23 ?>

案例解釋: 

在這里通過變量的賦值方式 與 對象的賦值方式方式相對比,代碼第5行中的賦值方式為“拷貝賦值”,故在修改其源值($a的值)的情況下,$b的值不受影響。$a與$b的內存關系圖如下:

 

而代碼20行將數據類型賦值給$p變量,通過$p修改對象內部的值成功,對比變量的傳值方式,證明這是引用傳值,內存關系圖如下:

 

這兩種最基本的搞清楚后,我們對面向對象傳值方式進行加深,請看一下代碼:

 1 <?php  2     class Person  3  {  4         public $name;  5         public $age;  6  }  7     // 將對象類型的數據 賦值 給一個變量
 8     $p = new Person;  9     // 通過對屬性修改值,來確定面向對象中 對象的傳值方式
10     $p->name = 'jesse'; 11     // 將對象賦予另一變量
12     $m = $p; 13     // 另一變量修改屬性值
14     $m->name = 'Marry'; 15     // 輸出源變量 賦值變量訪問內部屬性的結果
16     echo $p->name, $m->name; 17 ?>

 第12行代碼為本篇文章的最“點睛”的代碼,等號右邊為是一個對象,左邊是一個變量,那么犀利的問題來了,$m是將對象拷貝一份?還是按引用傳遞呢?該代碼內存關系如下:

 

所以,最后兩個對象的屬性值均被修改為Marry!!!

那按引用傳值會是怎么個情況?

 

 1 <?php  2     class Person  3  {  4         public $name;  5         public $age;  6  }  7     // 將對象類型的數據 賦值 給一個變量
 8     $p = new Person;  9     // 通過對屬性修改值,來確定面向對象中 對象的傳值方式
10     $p->name = 'jesse'; 11     // 將對象賦予另一變量
12     $m = &$p; 13     // 另一變量修改屬性值
14     $m->name = 'Marry'; 15     // 輸出源變量 賦值變量訪問內部屬性的結果
16     echo $p->name, $m->name; 17 ?>

 

                                     ------ Create By Jesse 2018.01.22

 


免責聲明!

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



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