PHP5:对象引用

PHP5:对象引用,php,oop,reference,circular-reference,Php,Oop,Reference,Circular Reference,我正在用php编写一些entities类,它们可能通过一个repository类相互指向(以避免使用本地实体存储库查询过多数据库): 问题是我得到一种超时/堆栈溢出,可能是因为$foo->bar是对bar对象的引用,而$bar->foo是对foo对象的引用,等等 我没有忘记声明使用&get()返回引用的函数,对吗 我的类是用=&运算符实例化的 我的代码(或逻辑)中可能有什么错误? 谢谢。如果我看对了,Bar的构造函数会尝试创建新的Bar。 我想这样的嵌套构造永远不会结束。这是相同的,例如,当

我正在用php编写一些entities类,它们可能通过一个repository类相互指向(以避免使用本地实体存储库查询过多数据库):

问题是我得到一种超时/堆栈溢出,可能是因为
$foo->bar
是对bar对象的引用,而
$bar->foo
是对foo对象的引用,等等

  • 我没有忘记声明使用&get()返回引用的函数,对吗
  • 我的类是用=&运算符实例化的
我的代码(或逻辑)中可能有什么错误?
谢谢。

如果我看对了,Bar的构造函数会尝试创建新的Bar。
我想这样的嵌套构造永远不会结束。这是相同的,例如,当函数递归地调用自身而无法退出时。
脚本甚至不会写入存储库

试过xdebug吗?这可能会很快说明问题所在


顺便说一句,有可能是错误的复制/粘贴。Foo类中的注释与它下面的行不匹配。您正在类栏中设置$this->bar,但只声明了类变量$foo。

我从未见过引用函数。PHP不能很好地处理循环引用,而且已知有些事情会导致问题。例如,如果您尝试
serialize()
,它将不确定地生成输出,直到内存或时间用完为止。垃圾收集器(或者至少我认为是gc造成的)也会有一些严重的性能问题和最终的崩溃。我最近对此有很多经验,并决定最好避免在PHP中使用循环引用。如何处理这种情况?在我的例子中,我有一个“用户”类和一个“资产”类。用户有一个化身(这是一个资产对象),资产有一个用户(这是用户对象)。而且,据我所知,您在任何时候都没有调用
get()
。您应该调用
&Repository::get()
,而不仅仅是
Repository()
。返回引用的函数也必须用
&
调用才能工作。但是,如果返回一个对象,则可以删除整个引用。对象已通过引用隐式传递。要在PHP中传递对象的副本,必须使用
clone$object
显式地说出它。这是一个错误的复制/粘贴,我实际上调用了Repository::get()。是的,这是一个错误的复制/粘贴,不,我从未尝试过xdebug,可能是因为它太复杂而无法配置。
class Foo
{
    public $fooId;
    public $bar;
    function __construct($entity_id)
    {
        /**
        * Some Database stuff to get Foo object based on $entity_id
        **/
        $this->bar = Repository::get('Bar', $databaseStuff->barId);
    }
}

class Bar
{
    public $foo;
    function __construct($entity_id)
    {
        /**
        * Some Database stuff to get Bar object based on $entity_id
        **/
        $this->bar = Repository::get('Bar', $databaseStuff->barId);
    }
}

class Repository
{
    private static $entities = [];
    /**
     * @param string $entity_name
     * @param int $entity_id
     * @return mixed
     */
    public static function &get($entity_name, $entity_id)
    {
        $entity_name = ucfirst(strtolower($entity_name));
        if(!isset(self::$entities[$entity_name][$entity_id]))
        {
            self::$entities[$entity_name][$entity_id] =& $entity_name($entity_id);
        }
        return self::$entities[$entity_name][$entity_id];
    }
}

$foo = new Foo(1337);