php - 困惑 : Endless arrays within arrays inside my class' data members. 类设计不好?

标签 php javascript oop

假设有三个类:

赞助商{id[int], name[string], providedProjects[数组 项目对象]}

项目{id[int], 名称[字符串], desc[字符串], sponsors[Sponsor 对象数组]}

学校{id[int], name[string], projectsDone[数组 项目对象}

我陷入了赞助商赞助项目项目赞助商之间。

理论上,如果我创建一个项目,那么我也需要为其创建赞助商。如果我创建赞助商,那么我也需要为其创建项目

因此,这将导致无穷无尽的项目数组,其中包含赞助商,其中项目包含赞助商> 在他们之内等等。我说得对吗?同样的问题也应该适用于学校,因为他们有项目数组,其中有赞助商数组,其中有项目数组> 等等。

如果是这样,我应该如何避免这个缺陷?

我的目标是临时从返回的多个 SQL 结果创建所有这些对象,然后我将其发送到 JavaScript 页面。

final class Sponsor{
    private $_id;
    private $_name;
    private $_projects;

    public function __construct($id, $name, Project $projects){
        $this->setSponsor($id, $name, $projects);
    }

    public function getId(){
        return $this->_id;
    }

    public function getName(){
        return $this->_name;
    }

    public function getProjects(){
        return $this->_projects;
    }

    private function setId($id){
        $this->_id = $id;
    }

    private function setName($name){
        $this->_name = $name;
    }

    private function setProject(Project $projects){
        $this->_projects = array();
        foreach($projects as $val){
            array_push($this->_projects, $val);
        }
    }

    private function setSponsor($id, $name, Project $projects){
        $this->setId($id);
        $this->setName($name);
        $this->setProjects($projects);
    }
}

final class Project{
    private $_id;
    private $_name;
    private $_desc;
    private $_sponsors;

    public function __construct($id, $name, $desc, Sponsor $sponsors){
        $this->setProject($id, $name, $desc, $sponsors);
    }

    private function setId($id){
        $this->_id = $id;
    }

    private function setName($name){
        $this->_name = $name;
    }

    private function setDesc($desc){
        $this->_desc = $desc;
    }

    private function setSponsors(Sponsor $sponsors){
        $this->_sponsors = array();
        foreach($sponsors as $obj){
            $id = $obj->getId();
            $name = $obj->getName();
            $projects = $obj->getProjects();
            array_push($this->_sponsors, new Sponsor($id, $name, Project $this));
        }
    }

    private function setProject($id, $name, $desc, Sponsor $sponsors){
        $this->setId($id);
        $this->setName($name);
        $this->setDesc($desc);
        $this->setSponsors($sponsors);
    }
}

final class School{

    private $_id;
    private $_name; 
    private $_projectsDone;

    public function __construct($id, $name, Project $projects){
        $this->setSchool($id, $name, $projects);
    }

    private function setId($id){
        $this->_id = $id;
    }

    private function setName($name){
        $this->_name = $name;
    }

    private function setProjectsDone($projects){
        $this->_projectsDone = array();
        foreach($projectsDone as $val){
            $this->{_projectsDone}[] = $val;
        }
    }

    public function setSchool($id, $name, $projectsDone){
        $this->setId($id);
        $this->setName($name);
        $this->setProjectsDone($projectsDone);
    }
}

最佳答案

你有一个 circular reference问题。不要让每个对象都保存与其相关的对象的数组,而是尝试保留其 id 的数组并在需要时查找相关实体。

关于php - 困惑 : Endless arrays within arrays inside my class' data members. 类设计不好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10757480/

相关文章:

php - 如何从数据库适配器获取 MySQL 中最后生成的错误

javascript - 如何获取客户端 Javascript 数组并通过 Node.js API POST 到 MongoDB 数据库?

javascript - 为什么这里一般调用 hasOwnProperty?

php - 单击按钮后 $_SESSION 变量丢失

php - 避免在 Woocommerce 中结账混合延期交货和正常商品

javascript - 使用 .destroy();有航点但仅在一个对象上

javascript - Angular 将数据传递给子组件

java - 抽象类中的公共(public)字段?

javascript - JS调用没有方法的对象时调用函数

php - 格式化查询输出 : using sql or php functions?