gpt4 book ai didi

php - 寻找一种处理/处理 PHP OOP 网站的方法

转载 作者:可可西里 更新时间:2023-11-01 14:02:03 26 4
gpt4 key购买 nike

我对 PHP 或编程一点都不陌生。但最近我在考虑使用 PHP 进行网站编程,以及在 OOP 出现之前它是多么容易。无论如何,我更喜欢 OOP 而不是旧的过程式风格。我想实现一个网站,但似乎我总是必须使用全局或静态变量。我开始怀疑,没有这些我怎么办?

无论如何,我所说的是为网站的每个“组件”创建一个类。例如,如果它是一个 url 缩短网站,它将是:链接、成员、数据库。

我说的要复杂得多,至少有 8 个类。无论如何,我目前的做法如下:

$database = new Database(...);
$links = new Links($db);
$users = new Users($db);

无论如何,例如我想通过其 ID 获取用户发布的所有链接,我需要同时使用链接和用户组件。

有没有其他方法可以做到这一点?还有其他方法吗?除了将它们作为构造函数参数传递。

最佳答案

您应该具有以下组件:

  1. 业务对象,在您的应用中建模和表达一个特定的“事物”:

    class Link { ... }
    class User { ... }

    这些不会“做”任何事情,它们只是用来规范您的数据结构。这些对象具有获取和设置各个属性的 getter 和 setter 方法,这些属性也在此处进行验证:

    public function setUrl($url) {
    if (!/* validate the URL here*/) {
    throw new InvalidArgumentException("$url is not a valid URL");
    }
    $this->url = $url;
    }

    最少需要的数据是构造函数的一部分。这可确保您的数据在应用程序范围内的完整性。它允许您断言,当您拥有 Link 的实例时,它表示的数据是链接的最小有效数据。

  2. 数据库链接。只是连接到数据库所必需的东西,仅此而已。原始的 PDOmysqli 对象就可以了。

  3. 数据对象映射器,它接受数据库链接并知道如何在数据库中存储业务对象以及如何检索它们:

    class LinkStorage {

    protected $db;

    public function __construct(PDO $db) {
    $this->db = $db;
    }

    }

    这个类有各种从数据库中检索内容的方法:

    public function getById($id) {
    $stmt = $this->db->prepare('SELECT ... FROM ... WHERE id = :id');
    $stmt->execute(compact('id'));

    if (!$data = $stmt->fetch()) {
    throw new RuntimeException("Record with id $id does not exist");
    }

    return new Link($data['url']);
    }

    您可以通过这种方式封装各种不同的查询,例如:

    /**
    * Returns all links by a particular user.
    * @param User $user
    * @return Link[]
    */
    public function getAllFromUser(User $user) {
    ...
    }

用法很简单:

$db          = new PDO(...);
$linkStorage = new LinkStorage($db);
$userStorage = new UserStorage($db);

$user = $userStorage->getById($id);
$links = $linkStorage->getAllFromUser($user);

然后,此类代码将被封装在一个服务类中,该类包含您可以在您的应用中执行的所有可能的“操作”。 registerUser(array $data), getLinksOfUser($id), newLinkFromPostData(array $data)

我刚才描述的基本上是 MVC 风格应用程序的模型部分。另外两个部分是调用服务方法的 Controller ,以及从服务方法检索输出数据的 View 。这种方法使职责分离和隔离,并允许您将更高级别的逻辑和功能像构建 block 一样放在一起。业务对象是最低的构建 block ,它们的结构需要牢固且定义明确,其余部分才能正常工作。数据对象映射器只关心将这些对象放入数据库并再次取出它们。服务然后以各种复杂的方式将所有这些组合在一起并使事情发生。

你不应该对此有任何循环依赖,因为责任是分开的。您的个人依赖关系可能仍然有些复杂。如果实例化类变得太麻烦,您将需要查看工厂:

$factory = new Factory;
$userStorage = $factory->newUserStorage();

实例化的所有复杂性都封装在这个工厂中。更进一步是依赖注入(inject)容器,您可以在其中进行配置,例如,一个 XML 文件以指定哪个类依赖于什么,然后 DI 容器将为您处理。

关于php - 寻找一种处理/处理 PHP OOP 网站的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24886229/

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