2012-11-29 25 views
0

這是一個討論主題,而不是「幫助我」的問題。如果不通過引用傳遞變量,如何覆蓋變量?

我剛剛遇到一個奇怪的問題。變量(對象)在未傳遞到任何地方時被覆蓋。

示例;

var_dump($node->title); 
$entity = $server->pull($item); 
var_dump($node->title); 

兩個var_dumps顯示兩個不同的值。

$ item是不相關的字符串。

在這一點上,我不認爲'拉()'方法的內容是相關的 - 我不是很好奇在哪裏被覆蓋,我很好奇它被覆蓋。

PHP如何改變變量,除非已經傳遞給方法?

我的函數中沒有引用,節點是直接傳遞的;

function my_function($node) { 

即使我讓我的對象 的克隆即使我重新命名了var

$my_node = $node; 

克隆的對象是仍然覆蓋。 重命名的對象是仍然覆蓋(即,它不涉及名稱。)

我很想知道這是可能的。 pull()(或相關的方法)如何超過一個他們還沒有給出的變量?

我需要重申;我不在乎其中的價值正在改變,我關心它是如何改變,當它沒有傳遞給方法。

回答

1

這樣做:

$my_node = $node; 

實際上並不克隆對象。如果更改$ my_node,則它將仍然反映在$ node中,因爲它們都只是指向該對象的指針,請參見http://www.php.net/manual/en/language.oop5.references.php

因此,可能某件事正在作用於$ node或$ node的副本並因此更改該對象。

從上面的鏈接見下面的例子:

class A { 
    public $foo = 1; 
} 

$a = new A; 
$b = $a;  // $a and $b are copies of the same identifier 
      // ($a) = ($b) = <id> 
$b->foo = 2; 
echo $a->foo."\n"; 

即使我們做了$ B = $ A,如果我們改變$ B的財產,它的變化對$ a的屬性。

+0

稀釋是,我的錯誤,並感謝在清除了(我更新了我的問題,以反映這一點。)但是這仍然沒有解釋它是如何被覆蓋。 – Christian

0

因此,PHP5中面向對象的一個​​重要部分是對象是總是通過引用傳遞,我完全忘記了。

這使得被調用的方法更有可能通過引用訪問我的對象,並使這個問題看起來很愚蠢。:)

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

+0

請接受實際上指向的現有答案。或者至少接受*任何*答案;) – hakre