1案例解釋:<?php 2//
宣告乙個變數並賦值
3$a = 1;4//
將資料型別的值 賦值 給乙個變數
5$b = $a;6
7//修改$a的值
8$a = 2;9//
$a和$b是兩個獨立的記憶體空間修改其中乙個另乙個不受影響
10echo
$b; //
1 11
12class
person
1317
//將物件型別的資料 賦值 給乙個變數
18$p = new
person;
19//
通過對屬性修改值,來確定物件導向中 物件的傳值方式
20$p->name = 'jesse';
21//
若是成功修改值,則是引用傳值
22echo
$p->name; //
jesse
23 ?>
在這裡通過變數的賦值方式 與 物件的賦值方式方式相對比,**第5行中的賦值方式為「拷貝賦值」,故在修改其源值($a的值)的情況下,$b的值不受影響。$a與$b的記憶體關係圖如下:
而**20行將資料型別賦值給$p變數,通過$p修改物件內部的值成功,對比變數的傳值方式,證明這是引用傳值,記憶體關係圖如下:
這兩種最基本的搞清楚後,我們對物件導向傳值方式進行加深,請看一下**:
1第12行**為本篇文章的最「點睛」的**,等號右邊為是乙個物件,左邊是乙個變數,那麼犀利的問題來了,$m是將物件拷貝乙份?還是按引用傳遞呢?該**記憶體關係如下:<?php
2class
person37
//將物件型別的資料 賦值 給乙個變數
8$p = new
person;9//
通過對屬性修改值,來確定物件導向中 物件的傳值方式
10$p->name = 'jesse';
11//
將物件賦予另一變數
12$m = $p;13
//另一變數修改屬性值
14$m->name = 'marry';
15//
輸出源變數 賦值變數訪問內部屬性的結果
16echo
$p->name, $m->name;
17 ?>
所以,最後兩個物件的屬性值均被修改為marry!!!
那按引用傳值會是怎麼個情況?
1<?php
2class
person37
//將物件型別的資料 賦值 給乙個變數
8$p = new
person;9//
通過對屬性修改值,來確定物件導向中 物件的傳值方式
10$p->name = 'jesse';
11//
將物件賦予另一變數
12$m = &$p;13
//另一變數修改屬性值
14$m->name = 'marry';
15//
輸出源變數 賦值變數訪問內部屬性的結果
PHP物件傳值 引用傳值
物件傳值本質上是引用傳值,將乙個物件變數 a 賦值給另個變數 b 實際上是將 a儲存的物件記憶體引用位址賦值 b,此時兩個變數指向的就是乙個物件。其中乙個變數傳送改變,另乙個也會跟著改變。和引用變數乙個道理。1.物件傳值示例 物件傳值本質上就是引用傳值 a new user b a 物件傳值 var...
php物件導向之轉殖物件
在前面的php物件導向之物件和引用,我們試圖以 b a 的方式複製物件以傳遞物件的值 內容 結果卻是傳遞物件的位址,在結尾為了解決複製物件這個問題,提到了轉殖的方法。接下來講一下php物件導向之轉殖物件。前面我們已經知道,使用傳址引用的方式呼叫物件,實質呼叫的是同乙個物件,有時需要建設立乙個物件的副...
python 實現按物件傳值
今天研究了下中的傳值問題,通常在c c 中有按值傳遞和按引用傳遞兩種情況,按值傳遞時會拷貝實參,而按引用傳遞時只是給形參賦了乙個指向實參的指標,但在python卻沒有區分這兩種情況。通過並實際測試,確實發現python沒有按值或者按引用來進行區別,對不同的引數物件還是按python基本型別的處理方式...