2010-02-19 80 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