1

这是部分观察,部分问题。
首先观察:
虽然每个人都在谈论模块化编程、OOP、正确的过程、面向方面、设计模式等,但一些流行的开源 PHP 应用程序是纯脚本文件,其结构由includes和控制requires

这对我来说看起来很愚蠢,直到我最近遇到了共享 Web 主机的问题——它们不支持共享主机上的 MySQL 存储过程。我检查了许多竞争的共享主机包——同样的故事。
然后我使用 SQL 查询和 DB-handling 类中的一些静态函数重写了代码。
那时我意识到,上述 PHP 项目实际上考虑了整个网络托管包,因此决定让代码尽可能地笨拙,以便覆盖更广泛的用户群。
另一件事是脚本对没有正式 Software Engg 背景的新手的影响:对于新手来说,脚本更容易破解

这两个是我看到解释这一现象的充分理由。
毫无疑问,维护这些项目的人非常擅长软件开发,所以这不是无能。
有时他们也有闲钱。

现在的问题是:你还能想到什么其他合理的理由?


编辑:我个人觉得这不仅仅是 OOP,正如其他人所指出的,良好的代码结构不依赖于 OOP/过程风格。我自己看过并编写了一些基于函数的 PHP 项目。

最困扰我的是文件夹/文件系统布局好,文件/文件夹命名好,文档丰富,遵循标准,但是,当你打开文件阅读代码时,有一百个if-then -else 条件、版本检查、偶尔使用输出缓冲、cookie 操作代码、一些常量、包含以及许多文件中没有清晰的结构。

至少我每次尝试阅读代码时似乎都迷失了方向。但是,如果我从 Java 或 C# 代码库,甚至是其他一些旁观的 PHP 应用程序中读取代码 - 函数内部的代码有适当的分离,模板用于显示等等。看起来井井有条。看起来很容易理解。
向后兼容性可能是维护者问题,但他们愿意以更结构化的方式制作下一个版本。但这也不会发生!
显然,我遗漏了一些东西,因为毕竟那些维护者总是努力工作。

4

4 回答 4

3

在使用 PHP 构建应用程序时,提供程序兼容性在许多领域都是一个问题,这不是在某些项目中不使用 OOP 的原因。

一些面向对象的编程特性,如接口、public/private/protected关键字等,只能在 PHP 5 中找到。一些应用程序仍然支持 PHP 4,主要是因为仍然有供应商不会升级(出于有理由担心他们的客户的 PHP 4 应用程序会崩溃)。因此,周围仍有很多“原始”的 PHP 4 OOP 代码。但是没有不支持至少基本 OOP 的 PHP 版本。

includerequire用于将代码片段导入当前脚本。您也会在面向对象的应用程序中找到它们。

有几种软件产品几乎根本不使用 OOP,只要整体代码质量良好,这很好。虽然许多人(包括我自己)认为它是编写更好、更可重用的软件的重要方法,但 OOP 并不是编写好软件的必要条件。

于 2010-01-02T10:52:53.627 回答
2

我看到三个主要原因:

  • 兼容性:PHP 从一开始就不包含 OOP。为了与较旧的 PHP 环境向下兼容并覆盖更广泛的受众,您需要保持现状。
  • 努力切换:将代码库从非 OOP 切换/重构到 OOP 需要大量工作(!!),在我看来,转换脚本不是解决方案,因为它们倾向于为机器生成代码,而不是为人类生成代码。从运行时的角度来看这是可以的,但对于维护来说很糟糕。
  • 团队文化:我与一些 PHP 开发人员交谈过,有些人只是不想进行转换,因为他们说一切都很好并且工作......
于 2010-01-02T13:13:06.993 回答
1

使用 PHP 实现所有 OOP 的最大障碍之一是必须在每个页面点击时重新加载、初始化和执行所有内容。如果您设计了一个真正面向对象的 PHP 系统,那么性能可能会很糟糕。将需要加载和配置大量文件和对象以使事情顺利进行。一切都必须在一秒钟内加载并准备好(理想情况下要少得多)。将其与基于 Java 的系统进行比较,在该系统中启动系统是否需要 10 分钟并不重要。启动后,一切都已加载并准备就绪。

WordPress 可能是一个很好的例子,说明在创建包含大量文件的模块化系统时事情会变得多么缓慢。更不用说模块化的 OOP 系统了。通过简单的“Hello World”页面对直接安装的 WordPress 进行负载测试将为您带来大约 10-15 页/秒的速度。相比之下,使用直接的“Hello World”php 脚本能够获得超过 100 页/秒。您可以使用 WordPress、Symfony 和其他系统所做的缓存来解决这些问题。

于 2010-01-02T14:21:45.653 回答
-2

除非您将 MVC 框架与 PHP 一起使用,否则这种面向对象的方法(如 ASP .NET 具有)会占用您太多时间。实际上,您需要先设计自己的框架。

我不能说在 php 中使用真正的面向对象方法是不可能的。您可以随心所欲地获取对象并序列化以在会话等中存储它们...

当谈到 PHP 中的 MVC 框架时,您可以看到真正的面向对象的方法。

在此处查看Zend 框架示例

Zend 框架不是唯一的。

但是“面向对象”这个词对于 PHP 来说是新的。只有 PHP5 被认为具有真正的 OOP。因此,您必须再等待 1-2 年才能拥有具有真正面向对象方法的优秀脚本。

于 2010-01-02T10:53:12.260 回答