在php5 的物件程式設計經常提到的乙個關鍵點是「預設情況下物件是通過引用傳遞的」。但其實這不是完全正確的。下面通過一些例子來說明。
php的引用是別名,就是兩個不同的變數名字指向相同的內容。在php5,乙個物件變數已經不再儲存整個物件的值。只是儲存乙個識別符號來訪問真正的物件內容。 當物件作為引數傳遞,作為結果返回,或者賦值給另外乙個變數,另外乙個變數跟原來的不是引用的關係,只是他們都儲存著同乙個識別符號的拷貝,這個識別符號指向同乙個物件的真正內容。
通俗說:普通的賦值操作只是傳遞了索引,只有在清除傳值物件的時候,才會發生寫時複製
<?php
//深入理解php物件賦值
echo
'';$obj = new stdclass;
$obj->name = 'pig';
var_dump($obj); //object(stdclass)#1 (1)
$copy = $obj; // $obj ,$copy都是new stdclass返回的同乙個識別符號的拷貝
var_dump($copy); //object(stdclass)#1 (1)
$objref = &$obj; // 此時會將$obj轉換成引用,然後賦值給$objref,因此$obj,$objref都為引用
var_dump($objref); //object(stdclass)#1 (1)
$objclone = clone
$obj; //新空間
$obj->name = 'after clone';
var_dump($objclone); //object(stdclass)#1 (1)
var_dump($obj); //object(stdclass)#1 (1)
//unset是刪除引用效果
$nameref = &$obj->name; //$obj->name被轉換成引用(& string),然後賦給$nameref
var_dump($obj); //object(stdclass)#2 (1)
unset($nameref); //刪除引用
var_dump($obj); //object(stdclass)#1 (1)
//null是賦值效果
$nameref = &$obj->name; //恢復name的引用
var_dump($obj); //object(stdclass)#2 (1)
$nameref = null;
var_dump($obj); //object(stdclass)#2 (1)
unset($objref); //僅僅刪除了引用
var_dump($obj); //object(stdclass)#1 (1)
$objref = &$obj; //恢復物件引用
$obj->name = 'lucy';
$obj = null; //賦值$obj為null,$obj只是new stdclass的標識拷貝,不會影響其內容。
//$objref做為$obj的引用,會同時被賦值null
//等價 $objref = null;
var_dump($obj,$copy,$objref,$objclone);
// null,
// object(stdclass)#1 (1) ,
// null,
// object(stdclass)#1 (1)
?>
物件轉殖
有的時候我們需要在乙個專案裡面使用兩個或多個一樣的物件,如果使用 new 關鍵字重新建立物件,再賦值上相同的屬性,這樣做比較煩瑣而且也容易出錯。php 提供了物件轉殖功能,可以根據乙個物件完全轉殖出乙個一模一樣的物件,而且轉殖以後,兩個物件互不干擾。
使用關鍵字 clone 來轉殖物件。語法:
$object2 = clone
$object;
例子:
<?php
class
person
function
say()
}$p1 = new person("張三", 20);
$p2 = clone
$p1;
$p2->say();
?>
執行例子,輸出:
我的名字叫:張三
我的年齡是:20
__clone()
如果想在轉殖後改變原物件的內容,需要在類中新增乙個特殊的 __clone() 方法來重寫原本的屬性和方法。__clone() 方法只會在物件被轉殖的時候自動呼叫。
例子:
<?php
class
person
function
say()
function
__clone
() }
$p1 = new person("張三", 20);
$p1->say();
$p2 = clone
$p1;
$p2->say();
?>
執行例子,輸出:
我的名字叫:張三 我的年齡是:20
我的名字叫:我是假的張三 我的年齡是:30
php物件轉殖
created by phpstorm.user tusi date 2017 8 25 time 10 21 class subobject 建構函式,每例項化物件一次,將公有屬性 instance值加1 public function clone 物件複製函式,如果物件中定義了 clone方法,...
php物件轉殖
思考 物件只能通過例項化產生,而且即便是將物件複製給變數,得到的還是同乙個物件,如果有的時候需要得到新的物件,除了例項化之外還有其他辦法?引入 物件理論上應該通過例項化來產生,這是物件產生的根本,但是有時候如果想在已有的物件上產生乙個新的物件,可以通過轉殖來實現。定義 轉殖物件clone,即通過已有...
PHP轉殖物件clone
有的時候我們需要在乙個專案裡面,使用兩個或多個一樣的物件,如果你使用 new 關鍵字重新建立物件的話,再賦值上相同的屬性,這樣做比較煩瑣而且也容易出錯,所以要根據乙個物件完全轉殖出乙個一模一樣的物件,是非常有必要的,而且轉殖以後,兩個物件互不干擾。class person 這個人可以說話的方法,說出...