Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php递归对象创建_Php_Recursive Datastructures - Fatal编程技术网

Php递归对象创建

Php递归对象创建,php,recursive-datastructures,Php,Recursive Datastructures,当我执行以下操作时: class AA { public $a = ''; function __construct() { $this->a = new BB(); } } class BB { public $b = ''; function __construct() { $this->b = new AA(); } } 我得到致命错误:允许的内存大小X字节已用尽 甚至有可能实现我在上面尝试

当我执行以下操作时:

class AA {
    public $a = '';

    function __construct() {
        $this->a = new BB();
    }
}

class BB {
    public $b = '';

    function __construct() {
        $this->b = new AA();
    }
}
我得到
致命错误:允许的内存大小X字节已用尽

甚至有可能实现我在上面尝试的目标吗

我试图实现的目标是:

假设我有对象:

Universe:
  Galaxy
  Galaxy
  Galaxy

Galaxy:
  Blackhole
  Star
  Star
  Star
  Star

Blackhole:
  Whitehole

Whitehole:
  Universe

然后,黑洞中的宇宙和大宇宙是一样的,它会像上面一样递归地继续下去。

在你的代码中,你创建了一个,它创建了B,它创建了另一个A,它创建了另一个B,依此类推。所以,是的,最终你会耗尽内存

我猜你想做的是

<?php

abstract class Element {
    private $elements;
    abstract protected function createElements();
    public function getElements() {
        if(null === $this->elements) {
            $this->elements = $this->createElements();
        }
        return $this->elements;
    }
}

class Whitehole extends Element{
    protected function createElements() {
        return [new Universe()];
    }
}
class Blackhole extends Element{
    protected function createElements() {
        return [new Whitehole()];
    }
}
class Galaxy extends Element{
    protected function createElements() {
        return [new Blackhole(), new Star(), new Star(), new Star(), new Star()];
    }
}
class Universe extends Element{
    protected function createElements() {
        return [new Galaxy(), new Galaxy(), new Galaxy()];
    }
}
class Star extends Element{
    protected function createElements() {
        return [];
    }
}

$universe = new Universe();
$universe->getElements()[0]->getElements()[0];

在您的代码中,您创建了A,它创建了B,它创建了另一个A,它创建了另一个B,依此类推。所以,是的,最终你会耗尽内存

我猜你想做的是

<?php

abstract class Element {
    private $elements;
    abstract protected function createElements();
    public function getElements() {
        if(null === $this->elements) {
            $this->elements = $this->createElements();
        }
        return $this->elements;
    }
}

class Whitehole extends Element{
    protected function createElements() {
        return [new Universe()];
    }
}
class Blackhole extends Element{
    protected function createElements() {
        return [new Whitehole()];
    }
}
class Galaxy extends Element{
    protected function createElements() {
        return [new Blackhole(), new Star(), new Star(), new Star(), new Star()];
    }
}
class Universe extends Element{
    protected function createElements() {
        return [new Galaxy(), new Galaxy(), new Galaxy()];
    }
}
class Star extends Element{
    protected function createElements() {
        return [];
    }
}

$universe = new Universe();
$universe->getElements()[0]->getElements()[0];

您定义了两个类来创建彼此的新实例。。。当然,你会得到内存错误…你做了错误的抽象。与其说是编程,不如说是哲学。如果从另一个事物中创造一个事物不是它的本质/本质,为什么你这样描述它们?更好的方法是,在你的银河系中创建
createBlackhole()
方法,在你的backhole类中创建
createWhitehole()
方法等。在需要时调用。因为星系的存在不是为了制造黑洞,或者黑洞的存在不仅仅是为了制造白洞。所以不要这样抽象。“如果有一天你想让universe成为你的编译器,当然,它也会吐出这个错误。”marmeladze是的,我明白你的想法,并且试过了,它是有效的。但是,我希望它永远递归地工作。查看[此链接]()并始终扩展第一个元素。我想做一些类似的事情。您定义了两个类来创建彼此的新实例。。。当然,你会得到内存错误…你做了错误的抽象。与其说是编程,不如说是哲学。如果从另一个事物中创造一个事物不是它的本质/本质,为什么你这样描述它们?更好的方法是,在你的银河系中创建
createBlackhole()
方法,在你的backhole类中创建
createWhitehole()
方法等。在需要时调用。因为星系的存在不是为了制造黑洞,或者黑洞的存在不仅仅是为了制造白洞。所以不要这样抽象。“如果有一天你想让universe成为你的编译器,当然,它也会吐出这个错误。”marmeladze是的,我明白你的想法,并且试过了,它是有效的。但是,我希望它永远递归地工作。查看[此链接]()并始终扩展第一个元素。我想做类似的事情。一个白洞不包含原始宇宙,而是一个新的宇宙对象。@DonJoe好吧,您将无法创建无限深的链,因为您使用的是内存有限的机器。@DonJoe我检查了您提供的链接,他们使用的模型与我的代码类似,他们只是在你点击时创建新元素,我想我的问题的答案是动态创建新元素。把这个加在你的答案上,我就接受了。顺便说一下,在[这个链接]()上,您可以看到我从您的解决方案中得到了一个
*递归*
文本。那个Php编译器是在试图保护堆栈溢出还是类似的东西?我以前从未见过这样的消息,我甚至在谷歌上找不到任何东西…@DonJoe我改变了我的截图,按需生成元素<代码>*递归*
意味着您到达了已经打印在某处的元素。由于无法打印循环树,解释器只是将其打断,因为whitehole不包含原始的宇宙,而是一个新的宇宙对象。@DonJoe嗯,您将无法创建无限深的链,因为您使用的是内存有限的机器。@DonJoe我检查了您提供的链接,他们使用的模型与我的代码类似,他们只是在你点击时创建新元素,我想我的问题的答案是动态创建新元素。把这个加在你的答案上,我就接受了。顺便说一下,在[这个链接]()上,您可以看到我从您的解决方案中得到了一个
*递归*
文本。那个Php编译器是在试图保护堆栈溢出还是类似的东西?我以前从未见过这样的消息,我甚至在谷歌上找不到任何东西…@DonJoe我改变了我的截图,按需生成元素<代码>*递归*
意味着您到达了已经打印在某处的元素。由于无法打印循环树,解释器只是将其破坏