php - OOP方式的蛋鸡问题

我有一个先有鸡还是先有蛋的问题。我也想以面向对象的方式在 PHP 中实现一个系统,其中两个类将扮演重要角色:数据库和日志。我的想法是通过数据库类建立连接,该类将具有公共(public)方法,例如。 runQuery(sUpdateQuery), doInsert(sInsert) 等。 Log 类会像 logMessage(message), logDatabaseQuery(sQuery) 一样通过常用方法将日志写入数据库。问题来了。

1:在数据库类的方法中,我希望能够使用日志类的 logDatabaseQuery(sQuery)

2:如果我不想在 logDatabaseQuery 方法中使用 Database 类的 doInsert(sInsert) 方法,这仍然不是一个大挑战。

我想保持简单 - 只使用数据库连接对象的一个​​实例,如果可能的话,也使用记录器。

对于很多人来说,单例模型是第一个选择的想法,但我绝对想使用不同的解决方案。

所以会有两个类使用彼此的方法:

数据库 做插入 日志数据库查询

日志 日志数据库查询 做插入

我想单独保留 Log 方法(在 Log 类中),因为稍后它会有其他方法不仅可以记录到数据库,还可以记录到文件或电子邮件。

任何想法,这应该/可以如何以最好的、OOP 友好的方式完成?

我一直在想一个公共(public)的父抽象类,或者也考虑使用接口(interface),但最终还是想不出合适的方法:(

我想知道的是关于正确类层次结构的建议

最佳答案

你组合了太多的东西。

数据库不能真正依赖于依赖于数据库的记录器。这不是好的设计。

您真正拥有的是两种数据库访问权限。

低级访问执行“原始”SQL。

记录器可以依赖于这个较低级别的类。它本身并不包含原始 SQL。它依赖于一个较低级别的类。

高级访问执行应用程序查询,它使用低级访问记录器。

https://stackoverflow.com/questions/727647/

相关文章:

php - 如何在 Perl 中进行全局正则表达式匹配?

list - Haskell:用关联列表中的给定键替换元素

oracle - 关闭 Oracle 中的索引

vba - VBA 中的 "Dim fso, MyFile, FileName, TextLine"

oracle - 如何使用 pl/sql 循环接受用户输入?

list - 如何找到列表列表中最长的列表?

visual-studio - 如何显示 Win32 MessageBox?

.net - 在运行时替换 .NET 类型

erlang - 如何获取erlang集群中的当前节点名称?

css - 如何使用 Notepad++ 将 css long 转换为 css one line s