arser.php 和 defparser.php 指向 Windows 上的同一文件。在 Linux 操作系统上,它们指向不同的文件。您可能提倡文件名要么全用大写, 要么全用小写,但最好的做法应该是使大小写保持不变。 解决这个小
问题 假设您想要一个函数,它能在不考虑大小写的情况下检查给定文件是否存在于某个目录中。首先,将这个 任务分解成一些简单的步骤。分解代码可能听起来有些可笑,但它确实有助于您在编写代码时将主要精力 放在这段代码上。另外,在纸上重写步骤始终比重写代码容易得多: 1. 获取源目录中的所有文件名 2. 过滤掉 . 和 .. 目录 3. 检查目标文件是否存在于该目录中 4. 如果文件存在,则获取具有正确大小写的文件名 5. 如果名称不匹配,则返回 false 要读取目录的内容,需要使用 readdir() 函数。可以在 PHP 手册(请参阅 参考资料 参考资料)中获取有关该函数 的更多细节。至于现在,只要知道: readdir() 在每次调用时会逐个返回给定目录中所有文件的名称。在 列出了所有的文件名后,它返回 false。您将使用一个循环,该循环在 readdir() 返回 false 时终止。
但这样就够了吗?请记住,
PHP 是类型宽松的语言, 这意味着会将整型值 0 与 false 视为相同 (甚至 C 也 把 0 和布尔值 false 视为等价)。问题不是该代码是否能正常
工作;想象一下,如果文件的名称是 0 会 如何!该脚本会过早终止。可以使用以下脚本( 清单 2)来确定 0 与布尔值 false 的等价性:
清单 2
. 确定 0 与布尔值 false 是否等价的脚本 // This text never prints.
那么您可以做什么呢?您知道 PHP 会在内部存储类型,而如果能够访问这些类型的话,问题就解决了。布 尔值 false 和整型值 0 明显是不同的。 PHP 有一个 gettype() 函数,但让我们在这里选择更简单的方法。您可以使用 === ===运算符(是的,有三个 等号)。不同之处在于该运算符同时比较数据的值和类型。如果您对此觉得有些疑惑,PHP 还有 !== 运算 符。只有 PHP 4 中才有这些新型运算符和 gettype() 函数。 清单 3 显示了解决该问题的完整代码:
清单 3. 完整代码 array_push($list, $file); } closedir($handle); return $list; } ?>
观察中得到的经验 我不打算对 清单 3 中各个函数的功能加以说明,相反,我鼓励您查阅 PHP 手册(请参阅 参考资料 参考资料)。 当您使用不熟悉的函数时,假设的参数与返回值的类型会是另一个错误根源。我没有对 PHP 中的内置函数 加以说明,而是打算说明一些不太一目了然的事情。 当终止条件中涉及不同的变量类型时,通过使用 === ===和 !== !==运算符进行强类型检查是很重要的。 由各部分组成的代码 我本来可以将整个脚本编写为一个函数,但这里我却把代码分割成两个函数。还记得前一篇文章中的“分 而治之”规则吗?我这么做正是因为每个函数所起的作用不同。如果您用其它脚本获取某个目录的内容, 那么现在就可以使用方便的实现。我希望您考虑一些事情:想象一下将整个脚本作为一个函数来实现,然 后想象调试、测试和重用代码所需的工作。 正确使用