PHP 中完全面向对象的框架

2022-08-30 22:33:31

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

任何关于这个东西应该具有哪些功能的指针,它应该使用任何现有的设计模式,如MVC?如何为数据库中的每个表创建对象,以及如何显示HTML模板等?

请不要链接到现有的框架,因为我想自己做这个主要是作为学习练习。你会因为链接到现有的框架作为你的答案,并说“这符合你的意愿”,你会被否决。

我希望拥有的一些功能是:

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

答案 1

我已经经历了你清单上的许多问题,所以让我具体说明一下我如何处理它。我也是OOP的瘾君子,发现对象技术非常灵活,强大而优雅(如果做得正确)。

MVC - 是的,放下手来,MVC是Web应用程序的标准。它是有据可查和可理解的模型。此外,它在应用程序级别上与OOP在类级别上的作用相同,也就是说,它使事物保持分离。MVC的不错补充是拦截过滤器模式。它有助于为预处理和后处理请求和响应附加筛选器。常见用途是记录请求、基准测试、访问检查、缓存等。

数据库表/行的 OOP 表示形式也是可能的。我每天使用DAOActiveRecord。解决 ORM 问题的另一种方法是行数据网关表数据网关。下面是 TDG 利用接口的示例实现ArrayAccess

HTML 模板也可以表示为对象。我将View对象与Smarty模板引擎结合使用。我发现这种技术非常灵活,快速且易于使用。对象表示视图应该实现方法,以便每个属性都传播到Smarty模板中。此外,还应实现方法以支持视图嵌套。请参阅示例:__set__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>

这样,您只需要内部视图(状态栏)将自动转换为HTML。在此处查看完整的实现。顺便说一句,使用拦截过滤器之一,您可以使用HTML页脚和页眉包装返回的视图,因此您不必担心从控制器返回完整的页面。echo $page

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

表单验证绝对是可以以OO方式完成的事情。使用复合模式构建复杂的验证器对象。复合验证程序应循环访问表单域和分配的简单验证程序,并为您提供“是/否”答案。它还应该返回错误消息,以便您可以更新表单(通过Ajax或页面重新加载)。

另一个方便的元素是自动翻译类,用于更改数据库中的数据以适合用户界面。例如,如果您在 db 中有表示布尔状态的 INT(1) 字段,并在 HTML 中使用复选框,导致空字符串或_POST或_GET数组,则不能只将一个字段赋值到另一个数组中。使用转换服务将数据更改为适合 View 或 db 是清理数据的一种干净方法。此外,翻译类的复杂性即使在非常复杂的转换期间也不会乱扔控制器代码(例如将Wiki语法转换为HTML)。"on"

此外,i18n问题也可以使用面向对象技术解决。我喜欢使用函数(双下划线)来获取本地化消息。该函数不是执行查找并返回消息,而是为我提供一个 Proxy 对象并预先注册消息以供以后查找。一旦代理对象被推送到视图中,视图被转换为HTML,i18n后端就会查找所有预注册的消息。这样,仅运行一个返回所有请求消息的查询。__

访问控制问题可以使用业务代表模式解决。我在我的另一个Stackoverflow答案中描述了它。

最后,如果您想使用完全面向对象的现有代码,请查看Tigermouse框架。页面上有一些UML图可以帮助您了解事情是如何工作的。请随时接管这个项目的进一步发展,因为我没有更多的时间来处理它。

有一个很好的黑客!


答案 2

现在冒着被否决的风险,同时作为一个正在开发自己的框架的人,我觉得有必要告诉你至少要获得一些使用现有框架的经验。它不必有大量的经验,也许可以为每个流行的教程做一些初学者教程。

考虑到构建一个好的框架需要花费大量时间,花时间研究你喜欢和厌恶现有解决方案的内容,相比之下,情况会显得苍白无力。你甚至不需要只看php框架。Rails,Django等都很受欢迎是有原因的。

建立一个框架是值得的,但你需要一个明确的计划和对手头任务的理解,这就是研究的用武之地。

一些问题的答案:

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

推荐