php正确构造类以提供所需的功能

时间:2017-09-19 10:25:02

标签: php design-patterns

我有以下课程:

class Author {
    public $id;
    public $name;
}

class Article {
    protected $author; // Author
    protected $title;  // String
    public function __construct(Author $author, string $title)
        $this->author = $author;
        $this->title = $title;
    }
}

要求是实施这些功能

  1. 每个Author代表文章列表
  2. 更改Author
  3. Article

    我首先考虑过上课:

    class ArticleList {
        public $author; // Author
        private $articles = [];
        public function addArticle(Article $article) {
            $this->articles[] = $article;
        }
    }
    

    但这似乎是错误的,不是吗?因为每个Article已经有Author,对我来说有点困惑,感谢帮助。

    提前致谢!

1 个答案:

答案 0 :(得分:1)

更新作者很简单,只需将方法setAuthor(Author $author)添加到Article类:

public function setAuthor(Author $author) {
    $this->author = $author;
}

您实际上不需要ArticleList类中的作者信息。它足以仅将article对象赋予addArticle方法,因为您可以通过文章本身获取作者姓名。

以下代码适用于所有作者,而不仅仅是一个作者!

class ArticleList {
    public $author;
    private $articles = [];
    public function addArticle(Article $article) {
        $this->articles[$article->author->name] = $article;
    }

    public function getArticleByAuthor($author) {
        if ($author instanceof Author) {
            $author = $author->name;
        }

        return (isset($this->articles[$author])) ?
            $this->articles[$author] : null;
    }
}

此方法将返回给定作者的所有文章(您可以将作者名称或作者类的实例作为参数),如果没有找到,则返回null。