不幸的是我无法提供任何代码示例,但我会尝试创建一个示例。 我的问题是PHP中的对象和内存分配。
如果我有一个物体,请说:
$object = new Class();
然后我做了类似
的事情$object2 = $object;
这实际上是做什么的?我知道有一个克隆函数,但这不是我要问的,我关心的是这是创建另一个相同的对象,还是它只是分配对$ object的引用。
我强烈理解这意味着它只是创建一个引用,但在某些情况下我的用法,我发现我创建了另一个$对象,我无法理解为什么。
答案 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