全局数据库对象

时间:2016-08-30 03:35:55

标签: php database oop

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

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

2 个答案:

答案 0 :(得分:1)

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

所以...更好的方式。

嗯,你有三个基本选择:

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

  • 使用服务地点,注册表或单身人士(都是反模式)

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

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

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

现在,请记住,DI容器通常有点advanced concept,我建议首先尝试使用工厂。特别是因为随着您在应用程序架构方面变得更好,您将遇到许多情况,其中组合工厂和DI容器是最佳方法。

有任何跟进问题吗?

答案 1 :(得分:0)

您应该注意的是自动加载。特别是顶部的命名空间称为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