您使用什么PHP应用程序设计/设计模式?

时间:2009-02-14 03:01:18

标签: php oop software-design

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

  • 文件夹的设计方式
  • 如何在PHP应用程序中使用对象oritentation
  • 您是否有处理CRUD,分页或任何其他常见任务的标准方法?
  • 您如何避免使用重复代码?您对图书馆/共享公共代码等的方法是什么?
  • 您可以通过哪些方式使代码更优雅?

您无需回答所有这些问题,回答其中任何一项或几项都会有所帮助。

我之所以这么说,是因为我厌倦了在PHP中编写重复的,丑陋的代码,我想为我的自由职业项目制作一个小框架,这将使编程更容易,让我专注于挑战/业务任务,而不是表单验证,分页和其他普通活动,占PHP编程工作的80%

所有观点赞赏!

9 个答案:

答案 0 :(得分:70)

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

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

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

  • 将安全放在首位 - 如果 你写了一个数据访问层,使用 绑定参数。如果你写一个表格 上课,防范CSRF和XSS。 抓住你的例外并处理你的 错误。确保你的PHP 环境是安全的。别试试 提出自己的加密 算法。如果你不专心 在安全方面,这不值得写 你自己的框架。
  • 评论您的代码 - 您需要 评论,以帮助您记住如何 一段时间后你的代码就可以了。一世 通常会找到docblock评论 绰绰有余。除此之外, 评论为什么你做了什么,而不是 你做了什么。如果你需要解释 什么,你可能想重构。
  • 单一责任类和 方法 - 你的大部分课程和 方法应该只做一件事 一件事。特别要注意 这与数据库 - 你的 分页课不应该依赖 你的数据访问对象,也不应该 几乎任何其他(低级)课程。
  • 单元测试 - 如果您的每个方法都是如此 只做一件事,它应该是远的 更容易测试它们,它会 导致更好的代码。写测试 首先,然后传递代码 测试。这也会给你更多 以后没有重构的自由 打破了一些东西。
  • 抽象类似课程 - 如果你 有多个班级 类似的事情,创建一个父类 使用之间的相似之处 类和扩展它。
  • 代表和模块化 - 如果你是 编写验证系统(和 你可能会有机会), 不要将每个验证器都包括在内 一些超级验证中的方法 类。将它们分成个体 类并根据需要调用它们。这个 可以应用于很多领域: 过滤器,语言,算法, 验证器,等等。
  • 保护和私有化 - 大多数情况下 例如,最好使用getter和 setter方法而不是允许 直接访问类变量。
  • 一致的API - 如果您有 render()方法和draw()方法 在不同的地方做同样的事情 上课,选一个,然后去吧 所有课程。保持秩序 方法的参数相同 使用相同的参数。一致的API是一种更简单的API。
  • 记住自动加载 - 该课程 名字可以变得有点笨重 很长,但是Zend的名字 类和组织目录 使自动加载更容易。 更新:从PHP 5.3开始,您应该开始使用命名空间。
  • 不要回复或打印任何内容 - 给予 它作为返回值并让用户 决定是否应该回应。很多 有时你会使用返回值 作为另一种方法的参数。
  • 不要试图解决世界问题 问题 - 先解决问题。如果 你现在不需要一个功能, 就像一个本地化数字的类 或日期或货币,不要写。 等到你需要它。
  • 不要预先优化 - 建立一些 用你的简单应用程序 框架在微调之前。 否则,你可以花很多钱 没时间生产的时间。
  • 使用源代码管理 - 如果您花费 创造了无数个小时 杰作,不要冒险 丢失。

答案 1 :(得分: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?

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

(使用框架时,我没有回答的两个问题非常暗示)

答案 2 :(得分:9)

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

MVC是当今流行框架中最常用的设计模式。 CakePHP是我选择的框架,虽然SymphonyZend也非常受欢迎 - 非常值得尝试一些,并且很快就会变得明显让您感到最舒服。

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

基本上,如果你追求一种真正的面向对象的语言,鼓励漂亮的代码和最好的设计实践PHP总是会失去Ruby Python和C#等。但是,PHP有其优势,例如不需要模板语言(它是一个),PHP可以非常快速和廉价地运行,并且不需要所有应用程序的大型框架的重量。

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

答案 3 :(得分:8)

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

  1. 即使你选择不使用它,其中一些写得很好而且设计得非常好。我特别喜欢Zend Framework,但我会在一秒钟内再回过头来看。
  2. 问问自己为什么要重新发明轮子。您是否真的觉得您理解其他人面临的相同设计问题比背后的社区(在此处插入选择框架)更好地证明从头开始编写某些内容?说起最初看过几个框架,并认为它们太大,提出了太多的学习曲线或过多的开销而开发了我自己的框架,我可以告诉你,从头开始编写自己的框架是一个很大的痛苦,如果你可以简单地使用现有的可以轻松扩展的内容。
  3. 说到使用可以轻松扩展的框架,我对Zend Framework有了非常积极的体验。它的内聚性和松散耦合结构使得可以快速,轻松地扩展任何现有组件,整个框架的设计理念是您需要编写自己的帮助程序和插件类来添加其整体功能。

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

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

答案 4 :(得分:2)

我已经解释了我的大部分PHP方法here

但是现在,我只能在任何地方使用Django。

答案 5 :(得分:2)

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

我用Joomla完成了一些项目,这实际上是一个CMS,但它让客户能够对内容进行大量控制。

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

答案 6 :(得分:2)

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

答案 7 :(得分: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)

答案 8 :(得分:1)

我一直在乱写自己的东西已经有一段时间了,每次我都无法完全完成它,因为我被困在某事上。

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

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

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

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