了解 PHP 中的 OOP
我可以将 PHP 与 TDD 结合使用吗?当然可以—由于 PHP 的 OOP 功能,它可以很好地与 TDD 配合使用。我们之前已经解释过,TDD 是一个过程,而不是一个可以安装的软件。你可以安装或下载工具来实现 TDD,其它编程语言也有很多不同的工具。
自 2000 年代初 PHP 5 发布以来,类和对象得到了支持,从而使 OOP 可以用于 PHP。如果读者对 OOP 有很好的理解,并参与过 PHP OOP 项目,那将是一个优势,但如果没有,我也会尽我所能向你介绍 OOP,因为它是一种有效和高效的编写软件的方法。我们还将在示例项目中使用 OOP,因此需要确保读者了解 OOP。
到底什么是 OOP?
OOP 是一种基于类和对象概念的编程风格。其目标之一是让软件开发人员编写可重用和可扩展的代码。
OOP 的重点是将行为、逻辑和属性打包成可重用的对象。这些对象是类的实例,而这些类就是我们软件开发人员必须编写的包含逻辑、例程和属性的文件。由于对象是基于类的,我们可以使用一个类创建许多对象实例。我们还可以使用 OOP 的继承功能来创建对象,该对象也将拥有其父类的功能。本章稍后,我们将讨论 OOP 中类和对象的区别。
当我还是一名初级开发人员时,我的朋友(一名 JavaScript
开发人员)告诉我,他很难理解 OOP,因为他读过一些使用车辆和动物比喻的 OOP 解释。他说他不明白这与他正在编写的实际软件有什么关系。因此,为了我们年轻的自己,如果有一天我穿越时空回到过去,我会尝试向我和我的朋友这样的初级开发人员解释 OOP,就好像我以前从未使用过 OOP 一样。我意识到,至少对我来说,如果我理解了问题和解决方案的目的,我就能更容易地理解这个概念。
我见过许多开发人员在这一概念上挣扎,未能利用其不可思议的力量。我早在大学使用 Java
和 C++
时就学会了 OOP,毕业后还做过专业的 C#
开发人员。那时,我认为 OOP 无处不在,是专业软件开发领域编写代码的常用方法,但当我开始从事第一个 PHP 专业职位时,我所开发的 PHP 应用程序的代码库中却没有任何 OOP 代码。有了 PHP,开发人员可以创建一个 PHP 文件,然后开始编写直接从 CLI 或网络浏览器执行的函数和代码。这真是太容易了!然而,这是一个滑坡。
我记得我曾对自己说:"我讨厌 OOP,它太复杂了;我为什么要浪费时间在 Java
和 C#
的 OOP 上,而仅仅是在网页上返回文本就得写这么多代码呢?果然,我最终编写了许多文件,其中包含大量数据库查询和大量业务逻辑。我基本上是在一个文件中编写了用户界面、业务逻辑和持久性代码。听起来是不是很熟悉?如果你是继承了我十多年前的意大利面条代码的可怜虫之一,我真诚地向你道歉。我用不同的语言写过有 OOP 和没有 OOP 的意大利面条代码。OOP 并不是解决混乱的意大利面条代码的灵丹妙药,但 OOP 肯定会有所帮助。这不是工具的问题,而是如何使用工具的问题。
我的兴奋并没有持续太久。作为一名初级 PHP 开发人员,我最终写出了许多带有大量随机函数的 PHP 文件。维护起来简直是噩梦,我甚至无法在应用程序的其他地方重复使用自己的代码!我告诉自己,如果当时使用了 OOP,即使代码杂乱无章,至少也能轻松借用或重用一些现有代码。现在,想象一下,在一个团队中,你们集体构建软件,却不能轻松地重复使用彼此的代码。我当时很讨厌 PHP,但事实证明,我没有正确使用 PHP。我不知道我还可以用 PHP 来实现 OOP。我认为,任何其他编程语言都是如此。语言有多好并不重要,项目的成功取决于软件工程师、开发人员和架构师本身。你可以在任何语言中使用 OOP,但仍然会产生意大利面条代码。在本书中,我们将使用 TDD 和软件开发最佳实践来帮助我们编写更好的、不那么纠结的代码。我们将在 第 8 章 "使用 TDD 和 SOLID 原则" 中讨论一些软件开发原则,这些原则将对我们编写更好的代码大有帮助。
我花了一段时间才真正理解 OOP 的真正好处。在网上阅读与车辆和动物有关的 OOP 解释很有帮助,但在项目中工作和体验不使用 OOP 的痛苦才真正让我豁然开朗。
有了 OOP,开发人员编写的代码可以很容易地被其他开发人员(包括你自己)借用或使用。
在接下来的章节中,我们将学习 OOP 的基本概念—抽象、封装、继承和多态性,但在此之前,我们需要开始定义什么是类和对象,以及它们之间的区别和如何区分。
在下面的示例中,我们还不会使用 TDD。我们将只关注 OOP 本身。我们将关注 OOP 在 PHP 中的具体实现。