请与我分享您最喜欢的应用程序设计/设计模式以供PHP使用.我想知道的一些事情:
文件夹的设计方式
如何在PHP应用程序中使用对象oritentation
您是否有处理CRUD,分页或任何其他常见任务的标准方法?
你如何避免使用重复的代码?您对库/共享公共代码等的方法是什么?
您可以通过哪些方式使代码更优雅?
您无需回答所有这些,回答其中任何一个或几个都会有所帮助.
我问这个的原因是因为我已经厌倦了在PHP中编写重复的,丑陋的代码而我想为我的自由职业项目制作一个小框架,这将使编程更容易,让我专注于挑战/业务任务而不是形成验证,分页和其他平凡的活动,这些活动占PHP编程工作的80%
所有意见赞赏!
我可能会为此投票,但如果你真的想写自己的框架,我会说,因为你将从经验中学到很多东西.这里提到的其他框架都很棒且经过测试,您不会使用它们做出错误的决定,但这是您的选择.
在开始编写框架之前,先看看其他框架(根据它们的语法,目录结构,命名模式,设计模式等),然后尝试弄清楚为什么他们会做他们做了什么以及做什么,如果有的话,你会做不同的事情.尝试一些教程并使用他们的代码,制作一些示例应用程序.如果在执行此操作之后,您不喜欢使用它们,那么请继续并开始规划您的框架,保持有效的工作并改进未完成的工作.
如果您决定自己动手,我会根据自己的经验推荐以下几点:
将安全性作为您的首要任务 - 如果您编写数据访问层,请使用绑定参数.如果您编写表单类,请防范CSRF和XSS.捕获异常并处理错误.确保您的PHP环境是安全的.不要尝试使用自己的加密算法.如果您不专注于安全性,那么编写自己的框架是不值得的.
评论您的代码 - 您需要注释以帮助您记住代码在一段时间后的工作方式.我经常发现docblock评论绰绰有余.除此之外,请评论为什么你做了什么,而不是你做了什么.如果您需要解释什么,您可能想要重构.
单一责任类和方法 - 您的大多数类和方法应该做一件事而且只做一件事.特别注意数据库 - 您的分页类不应该依赖于您的数据访问对象,也不应该依赖于任何其他(低级)类.
单元测试 - 如果你的每个方法只做一件事,测试它们应该容易得多,它会产生更好的代码.首先编写测试,然后编写代码以通过测试.这也将为您提供更大的自由度,可以在不破坏某些东西的情况下进行重构.
抽象类似的类 - 如果您有多个类执行类似的操作,请创建一个使用类之间相似性并扩展它的父类.
委托和模块化 - 如果您正在编写验证系统(并且您很可能会这样做),请不要在每个超级验证类中包含每个验证器作为方法.将它们分成单独的类并根据需要调用它们.这可以应用于许多领域:过滤器,语言,算法,验证器等.
保护和私有化 - 在大多数情况下,最好使用getter和setter方法,而不是允许直接访问类变量.
一致的API - 如果你有一个render()方法和一个draw()方法在不同的类中执行相同的操作,请选择一个并在所有类中使用它.对于使用相同参数的方法,保持参数的顺序相同.一致的API是一种更简单的API.
记住自动加载 - 类名称可以变得有点笨拙和长,但Zend命名类和组织目录的方式使自动加载更容易.更新:从PHP 5.3开始,您应该开始使用命名空间.
永远不要回显或打印任何内容 - 将其作为返回值并让用户决定是否应该回显.很多时候,您将使用返回值作为另一种方法的参数.
不要试图解决世界的问题 - 首先解决你自己的问题.如果您现在不需要某个功能,例如用于本地化数字或日期或货币的类,请不要编写它.等到你需要它.
不要预先优化 - 在对其进行微调之前,使用您的框架构建一些简单的应用程序.否则,你可以花很多时间在没有生产力上.
使用源代码控制 - 如果您花费无数时间创作杰作,请不要冒险迷失它.
我必须同意上述海报.如果你在使用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?
模型,视图和控制器的分离使得代码非常优雅.
(使用框架时,我没有回答的两个问题非常隐含)
我想很多php开发人员都遵循类似的路线:小脚本 - >程序/内联代码 - >可能看一下模板 - > OOP - >然后是框架.我认为PHP开发人员可以通过PHP"成长",学习设计模式以匹配当前版本的可用功能.
MVC是当今流行框架中最常用的设计模式.CakePHP是我选择的框架,虽然Symphony和Zend也非常受欢迎 - 非常值得尝试一些,很快你会觉得最舒服.
对于大多数项目(快速开发和可移植代码是优先考虑的事项),我使用Cake,但对于轻量级应用程序(我最近开发的是Good Baad),您希望快速运行(在低规格硬件上)并且不需要由一个大框架的功能添加的批量/重量我建议阅读Rasmus Lerdorf关于他的No Framework PHP MVC框架的文章.
基本上,如果你追求一种真正的面向对象的语言,鼓励漂亮的代码和最好的设计实践PHP总是会失去Ruby Python和C#等.但是,PHP有其优势,例如不需要模板语言(它是一个),PHP可以非常快速和廉价地运行,并且不需要所有应用程序的大框架的重量.
我鼓励采用一种设计模式,它采用像MVC这样的设计模式的可管理性,并将其与PHP的优势结合起来.
我几乎感觉像是一个破纪录,但我建议你看一些常见的框架有两个原因:
即使你选择不使用它,其中一些写得非常好并且设计得非常好.我特别喜欢Zend Framework,但我会在一秒钟之内再回过头来看看.
问问自己为什么要重新发明轮子.您是否真的觉得您理解其他人面临的相同设计问题比背后的社区(在此处插入选择框架)更好地证明从头开始编写某些内容?说起最初看过几个框架,并认为它们太大,提出了太多的学习曲线或过多的开销而开发了我自己的框架,我可以告诉你,从头开始编写自己的框架是一个很大的痛苦,如果你可以简单地使用现有的可以轻松扩展的.
说到使用可以轻松扩展的框架,我对Zend Framework有了非常积极的体验.它具有内聚性和松散耦合的结构,可以快速,轻松地扩展任何现有组件,整个框架的设计理念是您需要编写自己的帮助程序和插件类来添加其整体功能.
我发现Zend Framework是如此完全灵活,以至于我运行一个网站作为Zend Framework MVC的一部分,并且是我旧的糟糕框架,甚至是我还没有重写过的更老的代码.事实上,因为在重写过程中我们发现一个页面使用旧框架运行速度慢得令人无法接受,我已经将单个页面切换到Zend Framework架构下运行.
为了回答您的一些问题,我建议您查看Martin Fowler的企业应用程序架构模式.他提供了许多有关如何解决许多常见问题的宝贵见解,例如如何在应用程序中创建数据库交互层.Fowler还涵盖了MVC和Front Page Controller等主题.