PHP中完全面向对象的框架?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (25)

我想在PHP中创建一个100%面向对象的框架,完全没有过程编程,并且所有东西都是一个对象。很像Java,除了它将在PHP中完成。

应该使用任何现有设计模式(如MVC)的任何指向此功能的功能的指针?如何为数据库中的每个表创建对象是可能的,以及如何显示HTML模板等。

请不要链接到现有的框架,因为我想主要作为一个学习练习来做到这一点。

我想要的一些功能是:

  • 非常容易的CRUD页面生成
  • 基于AJAX的分页
  • 如果可能的话,基于Ajax的表单验证,或非常简单的表单验证
  • 可分表的表格
  • 能够使用PHP编辑HTML模板
提问于
用户回答回答于

我列出了许多问题,所以让我指出我是如何处理它的。我也是面向对象的瘾君子,并且发现对象技术非常灵活和强大而优雅(如果正确的话)。

MVC - 是的,MVC是Web应用程序的标准。它是有据可查的,可以理解的模型。此外,它还在应用程序级别上进行了OOP在课堂级别上的操作,即保持事物分离。MVC的好处是拦截过滤器模式。它有助于附加过滤器,用于预处理和后处理请求和响应。常见的用途是记录请求,基准测试,访问检查,缓存等。

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

<div id="status-bar"> Hello {$username} </div>

内容view/page.tpl

<html>
<head>....</head>
<body>
    <ul id="main-menu">.....</ul>
    {$statusBar}
    ... rest of the page ...
</body>
</html>

这样你只需要echo $page和内部视图(状态栏)就会自动转换成HTML。顺便说一下,使用拦截过滤器之一,你可以用HTML页脚和页眉包装返回的视图,因此你不必担心从控制器返回完整页面。

在设计时,是否使用Ajax的问题​​不应该很重要。该框架应该足够灵活以便本机支持Ajax。

表单验证绝对是可以用OO方式完成的事情。使用复合模式构建复杂的验证器对象。复合验证器应该遍历表单域并分配简单的验证器并给你Yes / No答案。它也应该返回错误消息,以便您可以更新表单(通过Ajax或页面重新加载)。

另一个便利的元素是自动翻译类,用于在db中更改数据以适合用户界面。例如,如果db中的INT(1)字段表示布尔状态,并使用HTML中的复选框来导致空字符串或"on"_POST或_GET数组,则不能将其分配给另一个。拥有将数据修改为适合View或for db的翻译服务是清理数据的一种干净方式。而且,即使在非常复杂的转换过程中,转换类的复杂性也不会浪费您的控制器代码。

同时国际化的问题可以使用面向对象技术来解决。我喜欢使用__函数(双下划线)来获取本地化的消息。该函数不是执行查找和返回消息,而是为我提供了一个代理对象并预先注册了消息以供以后查找。一旦代理对象被推入View AND View被转换为HTML,i18n后端会查找所有预先注册的消息。这样只有一个查询运行,返回所有请求的消息。

用户回答回答于

考虑到构建一个良好的框架需要花费的时间,花时间研究一下你喜欢和厌恶现有解决方案的情况将会相形见绌。你甚至不需要看看php框架。Rails,Django等都是有原因的。

建立一个框架是有益的,但是你需要明确的计划和理解手头的任务,这就是研究进行的地方。你的问题的一些答案:

  • 是的,它应该使用MVC作为模型视图控制器范例很好地转化为Web应用程序的世界。
  • 要根据数据库表中的记录创建模型,请查看ORM和Active Record模式。现有的研究,我知道包括学说的实现,更多可以通过在这里搜索找到。
  • 对于AJAX相关的任何事情,我建议使用jQuery作为起点,因为它使得AJAX非常容易启动和运行。

扫码关注云+社区