2010-02-19 83 views
1

不幸的是我不能提供任何代碼示例,但我會嘗試創建一個示例。 我的問題是關於PHP中的對象和內存分配。PHP對象問題

如果我有一個對象,讓說:

$object = new Class(); 

然後我做這樣的事情

$object2 = $object; 

這是什麼actualy在做什麼?我知道有一個克隆函數,但那不是我所問的,我關心這是創建另一個相同的對象,還是僅僅分配一個對$ object的引用。

我強烈地理解這意味着它只是創建一個引用,但在某些情況下我的用法,我發現我得到另一個$對象創建,我不明白爲什麼。

回答

1

如果你使用神奇的方法__invoke,你可以調用一個類似於函數的對象,它會調用這個魔術方法。

class Object{ 
    function __invoke(){ return "hi"; } 
} 

$object = new Object; 
$object2 = $object(); 
echo $object2; // echos hi 

這意味着$object2等於該函數返回的值。

基本上,你正在調用一個函數,但是使用一個變量作爲它的名字。所以:

function test(){ echo "hi"; } 
$function_name = "test"; 
$function_name(); // echos hi. 

在這種情況下,您只需調用一個對象。

因此,在參考你的問題,其實這是不是「克隆」可言,除非__invoke()功能如下:

function __invoke(){ return this } 

在這種情況下,這將是同一類的引用。

+0

對不起。我不明白相關性?你可以解釋嗎。 – Layke 2010-02-19 17:55:31

+2

@Laykes,你的代碼在任務周圍有一個括號,所以Chacha102假設你問了如何在PHP中使用invoke處理程序。 – 2010-02-19 18:02:26

+0

我更新了我的答案,以提供如何將其用於參考分配。 – 2010-02-19 18:05:22

0

假設你的意思

$object2 = $object; 

而且不

$object2 = $object(); 

PHP將創建原始對象的引用,它不會複製它。請參見http://www.php.net/manual/en/language.oop5.basic.php,該部分稱爲 對象分配。

+0

我的意思是第一個,但第一個海報回答了我過去的另一個問題。 謝謝。 – Layke 2010-02-19 19:00:16

1

您正在創建同一個對象的第二個引用。這裏是一個證明:

<?php 
class TestClass { 
    private $number; 

    function __construct($num) { $this->number = $num; } 
    function increment() { $this->number++; } 

    function __toString() { return (string) $this->number; } 
} 

$original = new TestClass(10); 

echo "Testing =\n"; 
echo "--------------------------------\n"; 
echo '$equal = $original;' . "\n"; 
$equal = $original; 

echo '$equal = ' . $equal . ";\n"; 

echo '$original->increment();' . "\n"; 
$original->increment(); 

echo '$equal = ' . $equal . ";\n"; 

echo "\n"; 
echo "Testing clone\n"; 
echo "--------------------------------\n"; 
echo '$clone = clone $original;' . "\n"; 
$clone = clone $original; 

echo '$clone = ' . $clone . ";\n"; 

echo '$original->increment();' . "\n"; 
$original->increment(); 

echo '$clone = ' . $clone . ";\n"; 

如果你想創建一個實例的副本,使用clone

+0

那麼,你沒有完全回答這個問題:什麼是'$ object2 = $ object()'。事實上,你們都沒有。 – 2010-02-19 18:17:46

+0

此外,我沒有投票,直到我得到了接受的答案,因爲我想確保他沒有鍵入'$ object()'。但事實證明,他沒有。而你們誰都沒有解決這個問題。 – 2010-02-19 18:23:16

+0

所以,我想說,你的評論暗示了我的降級是侮辱性的,並且是完全錯誤的。 – 2010-02-19 18:25:08

0
<?php 

class Object{ 
    public $value = 1; 

    public function inc(){ 
     $this->value++; 
    } 
} 

$object = new Object; 
$object2 = $object; 

$object->inc(); 

echo $object2->value; // echos 2, proving it's by reference