当前位置:  开发笔记 > 编程语言 > 正文

PHP中完全面向对象的框架

如何解决《PHP中完全面向对象的框架》经验,为你挑选了4个好方法。

我想在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:


....

    
    {$statusBar}
    ... rest of the page ...


这样你只需要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图表可以帮助您了解工作原理.请随时接管这个项目的进一步发展,因为我没有时间去研究它.

有一个很好的黑客!



1> Michał Rudni..:

我在你的清单上经历了很多问题,所以让我指出我是如何处理它的.我也是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:


....

    
    {$statusBar}
    ... rest of the page ...


这样你只需要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图表可以帮助您了解工作原理.请随时接管这个项目的进一步发展,因为我没有时间去研究它.

有一个很好的黑客!


我挖掘你的View课程.+1
顺便说一句,Tigermouse框架非常棒,非常有趣

2> navitronic..:

现在冒着被投票的风险,同时又是一个正在开发自己框架的人,我觉得有必要告诉你至少要有一些使用现有框架的经验.它不一定非常丰富,可能会为每个流行的教程做一些初学者教程.

考虑到构建一个好的框架所需的时间,花时间去研究你喜欢什么和讨厌现有的解决方案会比较苍白.你甚至不需要只看php框架.Rails,Django等都很受欢迎.

建立一个框架是有益的,但你需要一个明确的计划和对手头任务的理解,这是研究的结果.

您的问题的一些答案:

是的,它可能应该使用MVC,因为模型视图控制器范例可以很好地转换为Web应用程序的世界.

要从数据库中的表中的记录创建模型,请查看ORM和Active Record模式.我所知道的现有研究实施包括Doctrine,更多可以通过在这里搜索找到.

对于AJAX相关的任何内容,我建议使用jQuery作为起点,因为它使AJAX很容易启动和运行.



3> Jim OHallora..:

创建自己的框架是一种很好的方式,可以了解其他框架可能会发生的一些事情.如果你是一个像我这样的完美主义者,它会给你一个很好的借口来痛苦地对每一个细节进行痛苦(例如,如果该对象被称为X或Y,我应该使用静态方法还是实例方法).

我自己编写了(几乎完全是OO框架),所以这是我的建议:

如果您之前使用过其他框架,请考虑您喜欢/不喜欢的内容,并确保您的内容完全符合您的要求.

我个人喜欢MVC模式,如果没有它,我不会梦想做一个项目.如果你喜欢MVC,那就去吧,如果你不打扰.

如果你想做JavaScript/AJAX的东西,请使用JavaScript库.从头开始编写所有自己的JavaScript会教你一些关于DOM和JavaScript的内容,但最终会浪费时间,专注于改善你的app/framework.

如果您不想采用其他框架批发,请查看是否有其他您喜欢和可能想要使用的开源组件,例如Propel,Smarty,ADOdb或PEAR组件.编写自己的框架并不一定意味着从头开始编写所有内容.

在有意义的地方使用设计模式(例如,可能是用于数据库访问的单例),但不要对它们着迷.最终做任何你认为产生最新代码的事情.

最后,通过深入研究Ruby on Rails哲学我学到了很多东西,你可能永远不会使用RoR(我没有),但是一些概念(特别是Convention over Configuration)确实引起了我的共鸣并且影响了我的思想.

最终,除非您的需求特殊,否则如果采用现有框架,大多数人的工作效率会更高.但重新发明轮子确实会教你更多关于轮子的信息.



4> Steve Lane..:

在这种意义上,我觉得这听起来像是任何其他软件项目的风险:

您需要明确定义您的要求,包括动机和优先级:

为什么这样?您希望实现的主要好处是什么?如果答案是"速度"你可以做一件事,如果它是"编码的简易"你可能会做另一件事,如果它是"学习经验"你可能会做一个thid

你要解决的主要问题是什么?哪个最重要?安全?简单的UI生成?可扩展性?

"它应具备哪些功能"的答案实际上取决于上述问题的答案.

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有