PHP物件賦值與轉殖

2021-07-10 05:36:45 字數 3079 閱讀 9752

在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 這個人可以說話的方法,說出...