【问题标题】:Global database objects全局数据库对象
【发布时间】:2016-08-30 03:35:55
【问题描述】:

我最近开始学习 Laravel,我注意到 DB 对象是通过 use 传递的,允许在任何创建的方法中访问该对象。我猜这是通过将数据库连接信息存储为静态属性或在内部引用变量来完成的。

现在,在我自己的(非 Laravel)代码中,我在每个页面上加载的文件中创建了一个 PDO 和 MySQL 对象,我最终通过global 将其导入到任何函数/方法中,但我'我意识到这可能有点乏味。有一个更好的方法吗?我唯一能想到的是创建一个具有静态属性的对象,该属性是一个 DB 对象数组,以及一个返回它们的静态函数,因此我可以以 DB::use('mysql')->query 或其他方式访问它们。

【问题讨论】:

    标签: php database oop


    【解决方案1】:

    laravel 使用的是 traits。它基本上是复制粘贴的预处理器级简写。是的,这些特定特征访问的变量是静态的(也称为“全局状态”)。本质上,laravel 和你做的一样,但语法糖更多。这很糟糕。

    所以.. 一个更好的方法。

    嗯,你有三个基本的选择:

    • 使用工厂来共享多个对象之间的连接.. 因为我又坏又懒,你可以在我的an older answer 中阅读

    • 使用服务位置、注册表或单例(这些都是反模式)

    • 使用称为“依赖注入容器”或 DI 容器的系统

    现在,有可用的 DI 容器,但我建议您查看两个选项,Auryn 和 Symfony 的 DependencyInjection 组件。它们都有很好的手册,但其中一个主要是基于反射的,另一个是基于配置的。

    Auryn 文档专门以 sharing PDO 实例为例。

    现在,请记住,DI 容器总体上有点advanced concept,我建议从尝试使用工厂开始。尤其是当你在应用程序架构方面变得更好时,你会遇到很多情况,将工厂和 DI 容器结合起来是最好的方法。

    有任何后续问题吗?

    【讨论】:

      【解决方案2】:

      您应该研究的是所谓的自动加载。特别是顶部的命名空间称为 PSR-4 自动加载。这都是在使用 Laravel 时由 composer 生成的。你可以独立于 Laravel 运行 composer。 Laravel 的创建者 Jeffery Way 比我更好地解释了 PSR-4 自动加载的方式。 https://laracasts.com/lessons/psr-4-autoloading

      这里是使用 composer 进行自动加载的文档。 https://getcomposer.org/doc/01-basic-usage.md#autoloading

      【讨论】:

      • 我看过 PSR-4;不幸的是,我当前的代码只是部分 OOP。它符合 PSR-1/2 标准,但使其符合 3/4 标准几乎是一个完整的返工。相反,我正在尝试从 Laravel 中吸取教训,以便现在实施,直到我有时间重构或重新开发整个事物。另外,考虑到现在数据库连接是对象(特别是 PDO 和旧的 Mongo 类),自动加载有什么帮助?
      • 嗯,好的。所以很有可能你有大量的 php 文件直接被浏览器访问。因此,您可以做的是在所有单独的页面上都需要一个“主”文件。在主文件中,您将拥有所有通常需要的东西,例如会话和 dbconnections。同样在该主文件中,您将有一行用于自动加载,因此当您点击其中一个 php 文件时,您可以调用 new someClass 而无需在页面上要求或包含它。
      • 好的,所以我在问题的最后想的是,类似于DB 类,其中包含一些可用于检索数据库连接的静态方法。我现在有主文件,但如前所述,它们包含类的实例......创建一个主数据库类似乎是要走的路,如果有点冗长。
      猜你喜欢
      • 2020-08-23
      • 1970-01-01
      • 1970-01-01
      • 2013-09-28
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      相关资源
      最近更新 更多