我想在PHP中创建一个100%面向对象的框架,根本没有程序编程,一切都是对象.很像Java,除了它将在PHP中完成.
如果它使用任何现有的设计模式(如MVC),那么这个东西应该有什么功能的指针?如何为数据库中的每个表创建对象,以及如何显示HTML模板等?
请不要链接到现有的框架,因为我想自己做这个主要是作为一个学习练习.您将被投票以链接到现有框架作为您的答案并说"这就是您想要的".
我想要的一些功能是:
非常简单的CRUD页面生成
基于AJAX的分页
如果可能,基于Ajax的表单验证,或非常简单的表单验证
可排序的表格
能够使用PHP编辑HTML模板
Michał Rudni.. 30
我在你的清单上经历了很多问题,所以让我指出我是如何处理它的.我也是OOP上瘾者,并且发现对象技术非常灵活,强大而优雅(如果正确完成).
MVC - 是的,请放手,MVC是Web应用程序的标准.它是一个记录良好且易于理解的模型.此外,它在应用程序级别上做了OOP在类级别上所做的事情,也就是说,它将事物分开.MVC的好处是拦截过滤器模式.它有助于为处理前和处理后的请求和响应附加过滤器.常用的是记录请求,基准测试,访问检查,缓存等.
数据库表/行的OOP表示也是可能的.我每天都使用DAO或ActiveRecord.ORM问题的另一种方法是行数据网关和表数据网关.这是TDG利用接口的示例实现ArrayAccess
.
HTML模板也可以表示为对象.我将View对象与Smarty模板引擎结合使用.我发现这种技术极其灵活,快速且易于使用.表示视图的对象应该实现__set
方法,以便每个属性都传播到Smarty模板中.另外,__toString
应该实现方法来支持视图嵌套.见例子:
$s = new View(); $s->template = 'view/status-bar.tpl'; $s->username = "John Doe"; $page = new View(); $page->template = 'view/page.tpl'; $page->statusBar = $s; echo $page;
内容view/status-bar.tpl
:
Hello {$username}
内容view/page.tpl
:
....
这样你只需要echo $page
和内部视图(状态栏)将自动转换为HTML.看看这里的完整实现.顺便说一句,使用拦截过滤器之一,您可以使用HTML页脚和标题包装返回的视图,因此您不必担心从控制器返回完整页面.
在设计时,是否使用Ajax的问题不应该是重要的.该框架应该足够灵活,以便本机支持Ajax.
表单验证绝对是以OO方式完成的事情.使用Composite模式构建复杂的验证器对象.复合验证器应遍历表单字段并分配简单的验证器,并给出是/否答案.它还应该返回错误消息,以便您可以更新表单(通过Ajax或页面重新加载).
另一个方便的元素是自动转换类,用于在db中更改数据以适合用户界面.例如,如果db中的INT(1)字段表示布尔状态,并且在HTML中使用复选框导致空字符串,或者"on"
在_POST或_GET数组中,则不能只将一个分配给另一个.拥有改变数据以适合View或db的翻译服务是一种清理数据清理的方法.此外,即使在非常复杂的转换(例如将Wiki语法转换为HTML)中,转换类的复杂性也不会使控制器代码丢失.
同时国际化的问题可以使用面向对象技术来解决.我喜欢使用__
函数(双下划线)来获取本地化的消息.该函数代替执行查找和返回消息,为我提供了一个Proxy对象和预注册消息,供以后查找.一旦将Proxy对象推入View并将View转换为HTML,i18n后端会查找所有预先注册的消息.这样,只运行一个返回所有请求消息的查询.
可以使用Business Delegate模式解决访问控制问题.我在其他Stackoverflow答案中描述了它.
最后,如果您想使用完全面向对象的现有代码,请查看Tigermouse框架.页面上有一些UML图表可以帮助您了解工作原理.请随时接管这个项目的进一步发展,因为我没有时间去研究它.
有一个很好的黑客!
我在你的清单上经历了很多问题,所以让我指出我是如何处理它的.我也是OOP上瘾者,并且发现对象技术非常灵活,强大而优雅(如果正确完成).
MVC - 是的,请放手,MVC是Web应用程序的标准.它是一个记录良好且易于理解的模型.此外,它在应用程序级别上做了OOP在类级别上所做的事情,也就是说,它将事物分开.MVC的好处是拦截过滤器模式.它有助于为处理前和处理后的请求和响应附加过滤器.常用的是记录请求,基准测试,访问检查,缓存等.
数据库表/行的OOP表示也是可能的.我每天都使用DAO或ActiveRecord.ORM问题的另一种方法是行数据网关和表数据网关.这是TDG利用接口的示例实现ArrayAccess
.
HTML模板也可以表示为对象.我将View对象与Smarty模板引擎结合使用.我发现这种技术极其灵活,快速且易于使用.表示视图的对象应该实现__set
方法,以便每个属性都传播到Smarty模板中.另外,__toString
应该实现方法来支持视图嵌套.见例子:
$s = new View(); $s->template = 'view/status-bar.tpl'; $s->username = "John Doe"; $page = new View(); $page->template = 'view/page.tpl'; $page->statusBar = $s; echo $page;
内容view/status-bar.tpl
:
Hello {$username}
内容view/page.tpl
:
....
这样你只需要echo $page
和内部视图(状态栏)将自动转换为HTML.看看这里的完整实现.顺便说一句,使用拦截过滤器之一,您可以使用HTML页脚和标题包装返回的视图,因此您不必担心从控制器返回完整页面.
在设计时,是否使用Ajax的问题不应该是重要的.该框架应该足够灵活,以便本机支持Ajax.
表单验证绝对是以OO方式完成的事情.使用Composite模式构建复杂的验证器对象.复合验证器应遍历表单字段并分配简单的验证器,并给出是/否答案.它还应该返回错误消息,以便您可以更新表单(通过Ajax或页面重新加载).
另一个方便的元素是自动转换类,用于在db中更改数据以适合用户界面.例如,如果db中的INT(1)字段表示布尔状态,并且在HTML中使用复选框导致空字符串,或者"on"
在_POST或_GET数组中,则不能只将一个分配给另一个.拥有改变数据以适合View或db的翻译服务是一种清理数据清理的方法.此外,即使在非常复杂的转换(例如将Wiki语法转换为HTML)中,转换类的复杂性也不会使控制器代码丢失.
同时国际化的问题可以使用面向对象技术来解决.我喜欢使用__
函数(双下划线)来获取本地化的消息.该函数代替执行查找和返回消息,为我提供了一个Proxy对象和预注册消息,供以后查找.一旦将Proxy对象推入View并将View转换为HTML,i18n后端会查找所有预先注册的消息.这样,只运行一个返回所有请求消息的查询.
可以使用Business Delegate模式解决访问控制问题.我在其他Stackoverflow答案中描述了它.
最后,如果您想使用完全面向对象的现有代码,请查看Tigermouse框架.页面上有一些UML图表可以帮助您了解工作原理.请随时接管这个项目的进一步发展,因为我没有时间去研究它.
有一个很好的黑客!
现在冒着被投票的风险,同时又是一个正在开发自己框架的人,我觉得有必要告诉你至少要有一些使用现有框架的经验.它不一定非常丰富,可能会为每个流行的教程做一些初学者教程.
考虑到构建一个好的框架所需的时间,花时间去研究你喜欢什么和讨厌现有的解决方案会比较苍白.你甚至不需要只看php框架.Rails,Django等都很受欢迎.
建立一个框架是有益的,但你需要一个明确的计划和对手头任务的理解,这是研究的结果.
您的问题的一些答案:
是的,它可能应该使用MVC,因为模型视图控制器范例可以很好地转换为Web应用程序的世界.
要从数据库中的表中的记录创建模型,请查看ORM和Active Record模式.我所知道的现有研究实施包括Doctrine,更多可以通过在这里搜索找到.
对于AJAX相关的任何内容,我建议使用jQuery作为起点,因为它使AJAX很容易启动和运行.
创建自己的框架是一种很好的方式,可以了解其他框架可能会发生的一些事情.如果你是一个像我这样的完美主义者,它会给你一个很好的借口来痛苦地对每一个细节进行痛苦(例如,如果该对象被称为X或Y,我应该使用静态方法还是实例方法).
我自己编写了(几乎完全是OO框架),所以这是我的建议:
如果您之前使用过其他框架,请考虑您喜欢/不喜欢的内容,并确保您的内容完全符合您的要求.
我个人喜欢MVC模式,如果没有它,我不会梦想做一个项目.如果你喜欢MVC,那就去吧,如果你不打扰.
如果你想做JavaScript/AJAX的东西,请使用JavaScript库.从头开始编写所有自己的JavaScript会教你一些关于DOM和JavaScript的内容,但最终会浪费时间,专注于改善你的app/framework.
如果您不想采用其他框架批发,请查看是否有其他您喜欢和可能想要使用的开源组件,例如Propel,Smarty,ADOdb或PEAR组件.编写自己的框架并不一定意味着从头开始编写所有内容.
在有意义的地方使用设计模式(例如,可能是用于数据库访问的单例),但不要对它们着迷.最终做任何你认为产生最新代码的事情.
最后,通过深入研究Ruby on Rails哲学我学到了很多东西,你可能永远不会使用RoR(我没有),但是一些概念(特别是Convention over Configuration)确实引起了我的共鸣并且影响了我的思想.
最终,除非您的需求特殊,否则如果采用现有框架,大多数人的工作效率会更高.但重新发明轮子确实会教你更多关于轮子的信息.
在这种意义上,我觉得这听起来像是任何其他软件项目的风险:
您需要明确定义您的要求,包括动机和优先级:
为什么这样?您希望实现的主要好处是什么?如果答案是"速度"你可以做一件事,如果它是"编码的简易"你可能会做另一件事,如果它是"学习经验"你可能会做一个thid
你要解决的主要问题是什么?哪个最重要?安全?简单的UI生成?可扩展性?
"它应具备哪些功能"的答案实际上取决于上述问题的答案.