41

请与我分享您最喜欢的用于 PHP 的应用程序设计/设计模式。我想知道的一些事情:

  • 您的文件夹是如何设计的
  • 如何在 PHP 应用程序中使用面向对象
  • 你有处理 CRUD、分页或任何其他常见任务的标准方法吗?
  • 如何避免使用重复代码?您对库/共享公共代码等的方法是什么?
  • 有哪些方法可以让你的代码更优雅?

您不必回答所有这些问题,回答其中的任何一个或几个都会有所帮助。

我问这个的原因是因为我非常厌倦用 PHP 编写重复的、丑陋的代码,我想为我的自由职业项目制作一个小框架,这将使编程更容易,让我专注于具有挑战性的/业务任务而不是表单验证、分页和其他构成 PHP 编程工作 80% 的日常活动

所有意见表示赞赏!

4

9 回答 9

71

我可能会因此而被否决,但如果你真的想编写自己的框架,我建议你去做,因为你会从经验中学到很多东西。这里提到的其他框架都很棒并且经过测试,使用它们你不会做出错误的决定,但这是你的选择。

在开始编写您的框架之前,请查看其他框架(查看它们的语法、目录结构、命名模式、设计模式等),并尝试弄清楚它们为什么会这样做,以及如果有什么不同的话,您会做些什么。尝试一些教程并使用他们的代码,制作一些示例应用程序。如果在这样做之后,您不喜欢使用它们,那么请继续并开始规划您的框架,保持有效的部分并改进无效的部分。

如果你决定自己动手,我会根据自己的经验推荐以下几点:

  • 将安全作为首要任务- 如果您编写数据访问层,请使用绑定参数。如果你写了一个表单类,要提防 CSRF 和 XSS。捕获您的异常并处理您的错误。确保您的 PHP 环境是安全的。不要尝试提出自己的加密算法。如果您不专注于安全性,则不值得编写自己的框架。
  • 注释您的代码- 您将需要注释来帮助您在一段时间后记住您的代码是如何工作的。我通常发现 docblock 注释绰绰有余。除此之外,评论你为什么做某事,而不是你做了什么。如果您需要解释什么,您可能需要重构。
  • 单一职责类和方法——你的大多数类和方法应该做一件事,而且只做一件事。使用数据库时尤其要注意这一点 - 您的分页类不应依赖于您的数据访问对象,几乎任何其他(低级)类也不应依赖。
  • 单元测试- 如果您的每个方法只做一件事,那么测试它们应该会容易得多,并且会产生更好的代码。先写测试,再写代码以通过测试。这也将给您更大的自由,以便以后在不破坏某些内容的情况下进行重构。
  • Abstract Similar Classes - 如果你有多个类做类似的事情,创建一个父类,使用类之间的相似性并扩展它。
  • 委托和模块化- 如果你正在编写一个验证系统(你可能会这样做),不要将每个验证器作为方法包含在某个超级验证类中。将它们分成单独的类并根据需要调用它们。这可以应用于许多领域:过滤器、语言、算法、验证器等。
  • 保护和私有化——在大多数情况下,最好使用 getter 和 setter 方法,而不是允许直接访问类变量。
  • 一致的 API - 如果您有一个 render() 方法和一个 draw() 方法在不同的类中执行相同的操作,请选择一个并在所有类中使用它。对于使用相同参数的方法,保持参数顺序相同。一致的 API 是更简单的 API。
  • 记住自动加载- 类名可能有点笨重和冗长,但 Zend 命名类和组织目录的方式使自动加载更容易。更新:从 PHP 5.3 开始,您应该开始使用命名空间。
  • 从不回显或打印任何内容- 将其作为返回值并让用户决定是否应回显它。很多时候,您会将返回值用作另一个方法的参数。
  • 不要试图解决世界上的问题——先解决你自己的问题。如果您现在不需要某个功能,例如用于本地化数字或日期或货币的类,请不要编写它。等到你需要它。
  • 不要预优化- 在微调之前使用您的框架构建一些简单的应用程序。否则,您可能会花很多时间在没有生产力的事情上。
  • 使用源代码控制- 如果您花费无数小时来创作杰作,请不要冒险丢失它。
于 2009-02-24T10:51:36.633 回答
13

我必须同意上面的海报。如果您在使用 PHP 编程时没有使用框架,那么您实际上是在双手被绑在背后进行编程。我个人推荐CodeIgniter。它是最快的框架,非常容易学习,并且拥有一个非常活跃的社区。框架将回答您的所有问题:

* How your folders are designed

CodeIgniter(或与此相关的任何框架)将您的逻辑分成视图、模型和控制器,每个都有自己的文件夹。

* Do you have a standard way of dealing with CRUD, pagination, or any other common tasks?

CI 有一个分页库,它有像 DataMapper 这样的第三方库,用于以面向对象的方式 (ORM) 包装您的 CRUD 调用。

* What are ways in which you can make your code more elegant?

模型、视图和控制器的分离使得代码非常优雅。

(我没有回答的两个问题在使用框架时几乎是隐含的)

于 2009-02-14T06:46:46.160 回答
9

我想很多 php 开发人员都遵循与我类似的路线:小脚本 -> 过程/内联代码 -> 可能看一下模板 -> OOP -> 然后是框架。我认为对于 PHP 开发人员来说,随着 PHP 的“成长”,学习设计模式以匹配当前版本可用的功能,这可能是很常见的。

MVC 是当今流行的框架中最常用的设计模式。CakePHP是我选择的框架,尽管SymphonyZend也很受欢迎——值得尝试一些,很快就会发现你觉得哪个最舒服。

对于大多数项目(优先考虑快速开发和可移植代码),我使用 Cake,但是对于您希望快速运行(在低规格硬件上)并且不需要的轻量级应用程序(我最近开发的一个是Good Baad )我推荐阅读 Rasmus Lerdorf 关于他的No Framework PHP MVC 框架的文章中的一个大型框架的功能所增加的体积/重量。

基本上,如果你追求一种真正的面向对象语言,它鼓励漂亮的代码和最佳设计实践,PHP 总是会输给 Ruby Python 和 C# 之类的语言。但是,PHP 有它的优势,例如不需要模板语言(它就是其中之一),PHP 可以运行得非常快且成本低,并且不需要所有应用程序的大型框架的重量。

我鼓励采用一种设计模式,该模式采用 MVC 等设计模式的可管理性并将其与 PHP 的优势相结合。

于 2009-02-24T09:48:07.177 回答
8

我几乎感觉自己是个破纪录,但我建议你看看一些常见的框架,原因有两个:

  1. 即使您选择不使用其中之一,其中一些也写得非常好,设计得非常好。我特别喜欢 Zend 框架,但我稍后再谈。
  2. 问问自己为什么要重新发明轮子。你真的觉得你比背后的社区(在此处插入选择的框架)更了解其他人面临的相同设计问题,以证明从头开始编写东西是合理的吗?作为一个最初查看了几个框架并认为它们太大、学习曲线太长或开销太大并因此开发自己的框架的人,我可以告诉你,如果你从头开始编写自己的框架是一个很大的痛苦可以简单地使用可以轻松扩展的现有的。

说到使用可以轻松扩展的框架,我对 Zend Framework 有过非常积极的体验。它具有内聚但松散耦合的结构,可以快速轻松地扩展任何现有组件,整个框架的设计理念是您需要编写自己的帮助程序和插件类以添加到其整体功能中。

我发现 Zend Framework 非常灵活,以至于我将单个网站作为 Zend Framework MVC 的一部分运行,并且作为我旧的糟糕框架的一部分,甚至是我还没有重写的更旧的更糟糕的代码。事实上,因为在我们的重写过程中,我们发现使用旧框架运行的页面慢得让人无法接受,所以我已将单页面切换为在 Zend Framework 架构下运行。

为了回答您的一些问题,我建议您查看 Martin Fowler 的企业应用程序架构模式。他提供了很多关于如何解决这些常见问题的宝贵见解,例如如何在应用程序中创建数据库交互层。Fowler 还涵盖了 MVC 和 Front Page Controller 等主题。

于 2009-02-14T03:38:00.140 回答
2

我已经在这里解释了我的大部分 PHP 方法。

但是现在,我只是在我可以使用的任何地方使用 Django。

于 2009-02-14T04:41:00.957 回答
2

当我第一次厌倦了混合代码和 html 时,我开始使用smarty模板引擎。在 hack 了一段时间后,我意识到编写自己的框架只是重复工作。

我已经使用Joomla完成了一些项目,这确实是一个 CMS,但它让客户可以对内容进行大量控制。

最终,我决定为我的项目使用一个真正的框架。我正在使用symfony,它受到 Rails 的启发并且有很好的文档记录,但我听说cakePHPZendFramework也非常好。

于 2009-02-14T05:39:16.807 回答
2

我使用 Zend Framework,它几乎定义了文件夹布局和 OOP(MVC 范例)。对于常见任务,例如我使用的分页Zend_Paginator(我的模型类实现Zend_Paginator_Adapter_Interface),对于验证我使用Zend_Validate类等。因此,我可以完全专注于业务逻辑,而不是重新发明轮子。

于 2009-02-24T09:00:46.620 回答
2

使用Zend FrameworkDoctrine,我的文件夹结构通常如下所示:

root
  app
    config         (db config, routing config, misc config)
    doctrine       (fixtures, migrations, generated stuff, etc)
    lib
    logs
    models         (doctrine models)
    modules        (zend mvc modules)
    bootstrap.php
  docs             (db diagrams, specs, coding standards, various docs)
  pub              (web root)
  tests
  tools            (console tools, i.e. doctrine-cli)
  vendor           (zend and doctrine libraries, preferably as svn-externals)
于 2009-02-24T09:56:18.250 回答
1

我一直在乱写自己的东西有一段时间了,每次我都无法完全完成它,因为我卡在了一些东西上。

然后是我开始意识到我是否做对了的部分。

因此,我已经放弃了写我自己的一个与最喜欢的人群一起去的事情:Zend。

我看了看其他人,但似乎 Zend 已经存在了一段时间,他们知道自己的事情。

MVC 也是我现在写的任何东西的前进方式。

于 2009-02-24T14:21:46.537 回答