人人都能看懂的全栈开发教程——重构

人人都能看懂的全栈开发教程——重构

Chris Yue No Comment
Posts

我们的 index.php 在 Web 服务下能运行,在命令行下也能运行,但浏览器访问的效果并不是我们在 HTML 那一章所做的样子。我们虽然通过浏览器访问了任务列表页面,但这个页面实际上一行 HTML 都没有。

我们先将 index.php 作为命令行下运行的 PHP 程序保留,只不过将文件移动到 console/list.php 里

我们仍然需要一个 index.php 文件作为在 web 给浏览器访问的 PHP 文件。我们可以重新创建一个 index.php,但代码我们不就得重新写了吗?可能有些同学会说,console/list.php 里的代码大部分都应该能用,直接先将 console/list.php 复制一份到 index.php 就好了。

这个主意看起来还是很不错的,并且实际上在真正的开发工作中也有好多这样干的,但这个主意真的好吗?

假如我们除了提供 HTML 还提供 API 接口 (先不用管接口是什么意思,就当是另外一个 HTML 页面只不过是另外一种数据展现方式,比如之前说的 XML 格式),那么我们还得复制一份,似乎还是没有啥,但如果哪一天我们认为数据库使用默认的用户名,或者密码太简单,想改,那不就得改 3 处地方,不但麻烦,说不定因为接口是另外一个小伙伴写的,你也不知道,漏改了接口,导致接口访问报错。

无论代码是在命令行里执行,还是用来生成 HTML,还是用来提供接口,所使用的 PDO 都应该同样的配置。那么我们是否有办法,把创建 PDO 的过程,像小学时学的提取公因式一样,单独给他抽出来呢?

通过 PHP 的『引入』功能我们很容易做到。我们现在项目根目录下创建一个 pdo.php 文件,并写上以下代码:

然后我们修改 console/list.php 代码为:

我们先看第三行。require 后面接了一个『字符串』,而字符串的内容正是我们刚才创建的配置文件的文件名(实际上也是相对于我们的项目根目录 code 的文件路径),require 的作用就是,可以在文件 A 里引用文件 B,让文件 B 的代码也得到执行,你可以叫它包含,也可以说是引入。而且,如果被引入的文件 B,是通过 return 返回以一个值,那么 require 还可以将返回的值赋予给另外一个变量。

改完后我们在 code 目录执行

可以看到返回依然正常。但这么写有一个小问题,如果我们是在 console 目录里执行的

那么 PHP 就会报严重错误,这里我们只摘出最关键的一句:

Fatal error: require(): Failed opening required ‘config.php’

这是因为,require 会自动将当前 php 执行的路径添加在被包含的文件路径前面,当我们在 code 目录下运行时,因为 pdo.php 正好在 code 目录下,所以没有报错,但当我们在 console 目录下运行时,因为 console 里并没有 pdo.php 文件,所以报错。

但我们也有办法可以改进它,我们再重写第三行,改成:

可以发现无论是在什么目录运行,都不会报错了。__DIR__ 也是一个 PHP 内置的常量,它代表的是当前文件的『目录路径』。我们假设 console/list.php 的全路径是 /path/to/code/console/list.php,那么 list.php 里的 __DIR__ 就是 /path/to/code/console。而 .. 则表示『上一级目录』,大家在终端里执行

就是回到上一级目录。另外 PHP 里的 . 号,就是用来将两个字符串接在一起的操作符号。所以整个 __DIR__.'/../config.php',就是字符串 '/path/to/code/console/../config.php',所对应的路径也就是 /path/to/code/config.php

我们刚才做得那些修改,其实就是为了引出一个也是开发经常遇到的词,叫做『重构』,重构就是在软件的发展过程中,为了应对需求(无论是产品需求还是开发需求),作出的变化,包括代码的变化,文件组织的变化,甚至是编码规范的变化。

随着更多概念的引入,我们将会有更多的重构,在我的经验里,重构对学习帮助非常大,因为只有你了解得越多,越能看见自己代码的不足,你才越想重构。

本章最终代码可点此查看。

人人都能看懂的全栈开发教程——重构 by Chris Yue is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.

微信赞赏码

如果觉得文章还不错,就请扫码鼓励一下作者吧
天使打赏人

发表评论

+ 28 = 30