1

在 php 中返回一个对象会创建该对象的一个​​新实例吗?

我有一个为我存储对象的类,该类是一个返回任何给定对象的方法。例子;

class Simple {

     private $obj = array();

public function loadObj($name) {

    $this->obj[$name] = new $name();
}

public function getObj($key) {

    if(isset($this->obj[$key])) {
        return $this->obj[$key];
    }
}
}

然后在我的代码中我可以做这样的事情,

$a = new Simple();
$a->addObj('cat');
$cat1 = $a->getObj('cat');
$cat2 = $a->getObj('cat');

这是否每次都实例化一只新猫?

假设 cat 有一个颜色变量和 and 方法setColorgetColor如果我用改变颜色$cat1并用它来获取它,$cat2它们会一样吗?

我会测试它,但我不在家。

4

3 回答 3

1

不,两次都只会返回相同的值,因为您只在一个对象上调用该函数 $a->两次。除非您addObj多次调用,否则它不会在其中生成更多对象。也addObj没有在您的班级中定义。这是loadObj

于 2013-03-13T05:30:40.887 回答
0

我明白了你的要求,我想我在 PHP 手册中找到了正确的答案。

“PHP 引用是一个别名,它允许两个不同的变量写入同一个值。从 PHP 5 开始,对象变量不再包含对象本身作为值。它只包含一个对象标识符,允许对象访问器找到实际的对象。当一个对象通过参数发送,返回或分配给另一个变量时,不同的变量不是别名:它们持有标识符的副本,它指向同一个对象。

所以是的,如果你在 $cat1 上调用 set color ,它也会改变 $cat2 上的颜色,因为引用是指向同一个对象的别名。

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

于 2018-02-16T19:40:21.827 回答
0

每个 PHP 对象都由一个句柄(一个数字)标识。解释器使用句柄在内部表中查找对象。

一个存储 PHP 对象的变量实际上存储了这个句柄。当对象被分配给另一个变量时,句柄被复制到新变量,而不是实际对象的数据。

在 php 中返回一个对象会创建该对象的新实例吗?

在 PHP 中有两个创建新对象的操作符:newclone.

对象的所有其他操作(赋值、作为参数传递给函数的对象和函数返回的对象)复制对象句柄并且不复制实际对象。

于 2018-02-16T20:00:02.640 回答