PHP对象问题

时间:2010-02-19 17:53:46

标签: php oop

不幸的是我无法提供任何代码示例,但我会尝试创建一个示例。 我的问题是PHP中的对象和内存分配。

如果我有一个物体,请说:

$object = new Class();

然后我做了类似

的事情
$object2 = $object;

这实际上是做什么的?我知道有一个克隆函数,但这不是我要问的,我关心的是这是创建另一个相同的对象,还是它只是分配对$ object的引用。

我强烈理解这意味着它只是创建一个引用,但在某些情况下我的用法,我发现我创建了另一个$对象,我无法理解为什么。

4 个答案:

答案 0 :(得分: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 }

在这种情况下,它将是对同一类的引用。

答案 1 :(得分: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

答案 2 :(得分:0)

假设你的意思是

$object2 = $object;

而不是

$object2 = $object(); 

PHP将创建对原始对象的引用,它不会复制它。请参阅http://www.php.net/manual/en/language.oop5.basic.php,调用部分 对象分配。

答案 3 :(得分: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