我在php中编写了一些实体类,它们可能在一个存储库类之间相互指向(以避免使用本地实体存储库对数据库进行过多查询):
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);
问题是我得到一种超时/堆栈溢出可能是因为$foo->bar
是对Bar对象的引用,但是$bar->foo
是一个引用Foo对象等......
- 我没有忘记声明我的函数使用& get()返回引用,我是对的吗?
- 我的课程实例化为=&操作者。
我的代码(或我的逻辑)可能有什么问题? 感谢。
答案 0 :(得分:1)
如果我看对了,Bar的构造函数会尝试创建新的Bar 我想这样一个嵌套的构造永远不会结束。它是相同的,例如当一个函数以递归方式调用自身而无法退出时 该脚本甚至不会写入Repository。
曾经尝试过xdebug吗?这可能会很快显示问题。
顺便说一下,复制/粘贴可能不好。 Foo类中的注释与使用它的行不匹配。你在类Bar中设置了$ this-> bar,但只声明了类变量$ foo。