如何将SQL与PHP分开?

All*_*nde 3 php sql refactoring

关于Uncle Bob在Clean Code中的服务,我想在我的PHP代码中没有SQL.目前我正在使用Prepared Statements,我已将我的数据库访问代码考虑到模型类中.

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

此外,我很想知道是否有人试过这个和什么红利(如果有的话还清).

谢谢.

mad*_*lor 8

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

  • 这是一个非常ASP.NET的答案. (3认同)
  • 如果它是ASP.Nettish那么大呐喊......这是一个问题的解决方案. (3认同)
  • 好吧我想我需要澄清:我没有使用"ASP.NET'ish"作为一个积极的形容词.:) (3认同)
  • +1,这将产生干净整洁的分离 (2认同)

cle*_*tus 7

我给你的建议是不要犯这么多错误,试图把PHP变成不是的东西.

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

这些都不是问题.

然而,你会发现那些坚持试图强迫对象模型,ORM和他们习惯使用的其他结构从C#或Java编程到PHP的人,而且往往是一个错误.

为了专门回答你的问题,我倾向于将我的所有查询(函数)放在一个文件中(如果有很多文件,或者更多,我将通过数据库或某些功能分离将它们分开)和SQL只是在功能中的heredocs.不在yoru代码中嵌入SQL逻辑很有用.

您可以将SQL放在文本文件中并使用file_get_contents()它,但您获得了什么?

手动绞尽脑汁并尝试将其他语言和框架的原则应用于PHP,这一点毫无意义.使用PHP来擅长(或使用别的东西).无论哪种方式,你都会更快乐.


RC.*_*RC. 5

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

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