gpt4 book ai didi

php - 将全局数据库连接传递到模型的每个函数中有什么好处?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:08:13 28 4
gpt4 key购买 nike

我使用的是一个旧的代码库,它将DB连接传递到模型的每个类中的大多数函数中。数据库连接创建为全局连接,并在应用程序中的任何位置传递:

$user = new User();
$user->loadById($db, $userId);

与当前大多数框架的工作方式类似,与单个连接相比,通过这样做,整个模型继承了哪些优点?
任何洞察都会很有帮助。
完全披露:
我这样问这个问题是因为这是我们工作的方式。我不喜欢我们绕过数据库连接。我想找一个支持这种方法的人看看我的想法是否可以改变。这就是为什么我试图把讨论转移到这场谈话的赞成一方,而不被当作一个坏问题来阻止。而且成功了。我没有被禁赛,但是伟大的StackOverflow社区没有让我失望。看来我对这个问题的看法并不完全正确。

最佳答案

主要优点是:更容易。就像在中一样,这是最简单的事情,因为结果是,您没有应用程序体系结构。你从任何地方抓取东西,因为你不知道如何从其他地方获取它们,这使得可维护性非常差。猜猜5年后这种代码库会怎么样?巨大的遗留技术债务,而且很可能您的开发人员没有使用面向对象的编程——更可能在类中推送过程代码。
我不想费心解释全局状态,因为程序员已经存在一个fantastic answer。一小段摘录:
很简单,它使程序状态不可预测。
要详细说明,假设有两个对象都使用相同的全局变量。假设您没有在任何模块中的任何地方使用随机源,那么如果在执行方法之前系统的状态是已知的,则可以预测(并因此测试)特定方法的输出。
但是,如果其中一个对象中的方法触发了更改共享全局状态值的副作用,则当您在另一个对象中执行方法时,将不再知道起始状态是什么。现在,您无法再预测执行该方法时将获得什么输出,因此无法对其进行测试。
您会发现有些开发人员这样做纯粹是出于懒惰或对SOLID的基本概念缺乏了解。如果您访问全局状态(比如数据库),那么您当前编写的漂亮的、独立的类(理论上可以交给任何其他开发人员,也可以自己测试)现在耦合到云中某个地方的这个对象。
正如上面所说的,你在撒谎你的对象api。每个对象都应该通过其构造函数/方法签名,准确地指定它需要使用的所需外部对象。这允许:
你的对象要有一个明确的api用于它的使用
未来的开发人员可以从构造函数/方法签名中准确地看到这个对象运行所需的内容
通过Dependency Injection传入的所有内容(基本上是传递参数的时髦词汇)都可以“模拟”以实现可测试性。
由于第2点的原因,开发人员不需要通读您的代码来找出需要哪些其他对象
你不能访问其他东西可以改变的东西,在其他地方,并使调试成为一场噩梦
你的代码不应该是脆弱的。你应该完全有信心在一个庞大的代码库中的某个地方进行更改,而不必担心在其他地方破坏某些东西。你的单元测试将涵盖这一点。我强烈推荐阅读The Clean Coder,因为它阐述了其中一些概念。
almado有一张关于Singletons的好图片,基本上是返回对象的单个实例的对象,比如数据库或记录器。因此,如果您从它请求一个新的数据库,您要么得到一个新的,要么只是得到一个已经存在的数据库。在传统的请求/响应/死上下文中,这是完全不必要的。如果您有一个非常长时间运行的进程,这可能是必要的,特别是在其他语言中,但作为php的一般经验法则;除非您运行的是php web套接字服务器或类似服务器,否则di是一种更好的维护方法。
这与再次调用StaticObject::Database完全相同-可以从任何地方访问的内容。
This是一篇非常好的关于php中的singleton的文章,以及它们根本不需要的地方——这篇文章还有很多有用的链接。
基本上-不要偷懒和抓牢。它的存在是有原因的,当然也不仅仅是为了php。人们这样做的主要原因是因为他们不知道更好、更容易,而且容易并不总是最好的方法。
另外,还有一些额外的澄清。我们没有“模特儿”。我们有一个模型,它是一个层。这是对“mvc”的一个巨大的误解,我们甚至没有php中的“经典mvc”。我们有分离的关注点,就这样。
您的“模型”可能是服务、域对象、实体。More info关于模型是什么
您的用户不应该知道数据库。它应该是一个实体。Active Record Pattern不是前进的方向。看看DataMapper。存储库将使用数据库对象并返回一个User对象数组。从上下文的角度来看,用户访问数据库是没有意义的。
大多数框架都不能通过实体访问数据库来工作——这不再是PHP4了,从那以后它有了很大的进步;——)我强烈建议不要使用CakePHP(无论如何它都不是MVC),看看像Symfony这样的框架,它仍然有缺陷-知道你选择的框架的缺陷是非常重要的

关于php - 将全局数据库连接传递到模型的每个函数中有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30252729/

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