gpt4 book ai didi

PHP OOP设计结构

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:48:17 26 4
gpt4 key购买 nike

<分区>

我的问题适用于我为了更好地理解如何使用 OOP 而编写的这三个示例类。

class Book {
//not using getters/setters to save some space
public $name;
public $numreads;
}

class BookFactory {
private $db;
public function __construct(Database $db) {
$this->db = $db;
}
public function getBook($id) {
$book = new Book();

$book->name = $db->query("SELECT name FROM books...");

$booknumreads = new BookNumRead($this->db, $book);
$book->numreads = $booknumreads->getFromLocal() + $booknumreads->getFromAnotherSource();

return $book;
}
}

class BookNumRead {
private $db;
private $book;
public function __construct(Database $db, Book $book) {
$this->db = $db;
$this->book = $book;
}

public function getFromLocal()
{
return $this->db->query("SELECT COUNT ... WHERE name = $book->name");
}

public function getFromAnotherSource()
{
return API::getNumReadsOfABook($book->name);
}

//or just stick with this method in this class
public function getNumReadsOfBook($name)
{
return (
$this->db->query("SELECT COUNT ... WHERE name = $name")
+
API::getNumReadsOfABook($name)
);
}
}

//get number of reads of a book
$db = new Database();
$bookfactory = new BookFactory($db);
$book = $bookfactory->getBook(123);
echo $book->getNumReads();
  1. 首先,这是一个好的 OOP 方法吗?

  2. 这些类(class)是完全不同的。领域与值(value)对象?例如,我的应用程序中可以有任意多的 Book 对象。然而,BookFactory 就像我的应用程序中的一项服务,我的应用程序中只需要一个服务,但我可能在我的应用程序的许多其他地方需要这个类,我应该把它作为一个对象放在 ServiceLocator/ServiceContainer 中吗?

  3. BookNumRead 类也可以放在 ServiceLocator/ServiceContainer 中,并在不注入(inject) Book 对象的情况下由 getNumReadsOfBook() 方法使用,但这感觉像是过程式编程?或者,如上例所示,由 BookFactory::getBook() 启动,但随后我需要将数据库(注入(inject)了一个 BookFactory)和一本书传递给它,这感觉有点凌乱,因为它可能需要其他“服务”类,例如记录器。这里的最佳做法是什么?

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com