【问题标题】:How can I separate SQL from my PHP?如何将 SQL 与我的 PHP 分开?
【发布时间】:2009-08-27 17:28:40
【问题描述】:

按照 Bob 叔叔在 Clean Code 中的建议,我希望我的 PHP 代码中没有 SQL。目前我正在使用Prepared Statements,并将我的数据库访问代码分解为模型类。

我最初的想法是将我的 SQL 分解为单独的 SQL 文件,然后在运行时加载它们。由于这涉及更多磁盘 IO(我的直觉),我想知道是否有人建议以另一种方式进行。

另外,我很想知道是否有人尝试过这个以及有什么好处(如果有的话)。

谢谢。

【问题讨论】:

  • “在运行时加载它们”是什么意思
  • 我的意思是在执行之前需要从磁盘中获取它们。而不是在 PHP 代码中内联。

标签: php sql refactoring


【解决方案1】:

我对你的建议是不要犯太多的错误,试图将 PHP 变成它不是的东西。

PHP 是一种以 Web 为中心的模板语言,允许您在 HTML 页面中嵌入代码。它有一个请求生命周期,而不是持久的(就像 Java servlet 一样)。它的 API 本质上是程序化的。

这些都不是问题。

但您会发现有人坚持试图将他们习惯的对象模型、ORM 和其他结构从 C# 或 Java 编程强制转换为 PHP,这通常是错误的。

为了具体回答您的问题,我倾向于将所有查询(函数)放在一个文件中(或者如果有很多,则更多,在这种情况下,我将通过数据库或某些功能分离将它们分开)并且 SQL 只是在函数中的 heredocs 中。不在你的代码中嵌入 SQL 逻辑很有用。

您可以将该 SQL 放在文本文件中并在其上使用 file_get_contents(),但您会得到什么?

绞尽脑汁并尝试将其他语言和框架的原则应用于 PHP 是没有意义的。使用 PHP 来做它擅长的事情(或使用其他东西)。无论哪种方式,您都会更快乐。

【讨论】:

    【解决方案2】:

    我认为您正在寻找的是数据访问层。我还没有读过“清洁代码”,但我猜 Bob 叔叔的意思是没有一堆原始 SQL 和数据库设置/访问代码到处都是。将数据库准备、执行等代码抽象到一个单独的模块中,然后从那里开始工作。

    恕我直言,关于使用存储过程的评论也是一个好主意,尽管这是一个备受争议的话题,双方都有好处。我倾向于使用 SP,但它们并不适合所有人或所有情况。

    【讨论】:

    • 我的数据访问层是我的模型类,只是最终你最终将 PHP 和 SQL 混合在同一个文件中。在书中,他实际上是指在 1 个文件中包含多种语言,英语和 Java + SQL 将是 3 种不同的语言。
    • 当 PHP 是呈现和操作数据的人时,混合使用 SQL 和 PHP 是否有意义?在我看来,问题不在于将 SQL/SP 与您的 PHP 代码混合,而在于您如何进行混合并将其最小化以使代码具有可读性和可维护性。
    【解决方案3】:

    如果您只是想分离 SQL,为什么不使用存储过程?

    【讨论】:

    • 这是一个非常类似于 ASP.NET 的答案。
    • 如果它是 ASP.Nettish,那就太棒了。它是解决问题的方法。
    • 好吧,我想我需要澄清一下:我没有使用“ASP.NET'ish”作为积极的形容词。 :)
    • 虽然我正在使用 Mysql,但我还没有 100% 相信它的实现。 +1 无论如何都是好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2019-01-04
    • 2022-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 2020-05-05
    • 1970-01-01
    相关资源
    最近更新 更多