2013-03-13 82 views
1

在php中返回一個對象是否會創建該對象的一個​​新實例?在php中返回對象?

我有一個類爲我在該類中存儲對象是一種方法,返回任何給定的對象。例;

class Simple { 

    private $obj = array(); 

public function loadObj($name) { 

    $this->obj[$name] = new $name(); 
} 

public function getObj($key) { 

    if(isset($this->obj[$key])) { 
     return $this->obj[$key]; 
    } 
} 
} 

然後在我的代碼,我可以做這樣的事情,

$a = new Simple(); 
$a->addObj('cat'); 
$cat1 = $a->getObj('cat'); 
$cat2 = $a->getObj('cat'); 

這是否實例化一個新的貓每次?

說貓有顏色和setColorgetColor方法的變量,如果我$cat1改變顏色,並與$cat2脫口說他們會是一樣的嗎?

我會測試它,但我不在家。

+0

'addObj'不存在。 – hjpotter92 2013-03-13 05:30:36

+1

你你得到了jist ... – Griff 2013-03-13 05:31:30

回答

1

不,這兩次只會返回相同的值,因爲您只在一個對象$a->上調用了兩次函數。除非您多次撥打addObj,否則不會在其中生成更多對象。 addObj也沒有在您的班級中定義。它是loadObj

+0

所以如果我使用'$ cat1'改變了一個值並且使用'$ cat2'來檢索它們,它們都會被改變嗎?如果對象'cat'具有getLength和'setLength'方法的長度值? – Griff 2013-03-13 05:34:29

+0

您將必須先編寫一個更改值方法,只有這樣我們才能知道它是否或不是 – 2013-03-13 05:35:29

0

我得到你問的,我想我在PHP手冊中找到了正確的答案。

「PHP引用是一個別名,它允許兩個不同的變量寫入相同的值。從PHP 5開始,對象變量不再包含對象本身作爲值,它只包含一個對象標識符允許對象訪問器查找實際的對象,當一個對象通過參數發送,返回或分配給另一個變量時,不同的變量不是別名:它們包含指向同一對象的標識符的副本。

所以是的,如果你在$ cat1上調用set color,它也會改變$ cat2上的顏色,因爲引用是指向同一個對象的別名。

http://php.net/manual/en/language.oop5.references.php

0

每個PHP目的是identified by a handle(這是一個數字)。解釋器使用句柄在內部表中查找對象。

存儲PHP對象的變量實際上存儲此句柄。當對象被分配給另一個變量時,句柄被複制到新變量中,而不是實際對象的數據。

在php中返回一個對象是否會創建該對象的一個​​新實例?

有兩個運算符在PHP中創建新對象:newclone

對象的所有其他操作(賦值,對象作爲參數傳遞給函數和對象返回的函數)複製對象句柄並且不復制實際對象。