快速业务通道

用PHP开发健壮的代码:有效地使用变量,第2部分

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-22
.php和defparser.php 指向Windows上的同一文件。在Linux操作系统上,它们指向不同的文件。您可能提倡文件名要么全用大写,要么全用小写,但最好的做法应该是使大小写保持不变。

解决这个小问题

假设您想要一个函数,它能在不考虑大小写的情况下检查给定文件是否存在于某个目录中。首先,将这个任务分解成一些简单的步骤。分解代码可能听起来有些可笑,但它确实有助于您在编写代码时将主要精力放在这段代码上。另外,在纸上重写步骤始终比重写代码容易得多:

获取源目录中的所有文件名

过滤掉 . 和 .. 目录

检查目标文件是否存在于该目录中

如果文件存在,则获取具有正确大小写的文件名

如果名称不匹配,则返回 false

要读取目录的内容,需要使用 readdir() 函数。可以在PHP手册(请参阅 参考资料)中获取有关该函数的更多细节。至于现在,只要知道: readdir() 在每次调用时会逐个返回给定目录中所有文件的名称。在列出了所有的文件名后,它返回 false。您将使用一个循环,该循环在 readdir() 返回 false 时终止。

但这样就够了吗?请记住,PHP 是类型宽松的语言,这意味着会将整型值 0 与 false 视为相同(甚至 C 也把 0 和布尔值 false 视为等价)。问题不是该代码是否能正常工作;想象一下,如果文件的名称是 0 会如何!该脚本会过早终止。可以使用以下脚本( 清单 2)来确定 0 与布尔值 false 的等价性:

清单 2. 确定 0 与布尔值 false 是否等价的脚本

<?php
$file_name = 0;
if (0 == $file_name ) {
echo "The code is in trouble ...\n"; // This text prints on the screen.
}
else {
echo "Phew ... The code is safe";  // This text never prints.
}
?>

那么您可以做什么呢?您知道PHP会在内部存储类型,而如果能够访问这些类型的话,问题就解决了。布尔值 false 和整型值 0 明显是不同的。

PHP有一个gettype()函数,但让我们在这里选择更简单的方法。您可以使用 ===运算符(是的,有三个等号)。不同之处在于该运算符同时比较数据的值和类型。如果您对此觉得有些疑惑,PHP还有 !== 运算符。只有PHP4中才有这些新型运算符和gettype() 函数。 清单 3显示了解决该问题的完整代码:

清单 3. 完整代码

<?php
/* This is the function where the action takes place */
function chk_file_name( $name, $path="." ) {
$fileList = get_file_list($path);
foreach ($fileList as $file) {
if (eregi($name, $file)) {
return $file;
}
}
return false;
}
/* Return the list of files in a given directory in an array.
Uses the current directory as default. */
function get_file_list($dirName=".") {
$list = array();
$handle = opendir($dirName);
while (false !== ($file = readdir($handle))) {
/* Omit the ''.'' and the ''..'' directories. */
if ((".."== $file) || ("."== $file)) continue;
array_push($list, $file);
}

closedir($handle);
return $list;
}
?>

观察中得到的经验

我不打算对 清单 3中各个函数的功能加以说明,相反,我鼓励您查阅PHP手册(请参阅 参考资料)。当您使用不熟悉的函数时,假设的参数与返回值的类型会是另一个错误根源。我没有对PHP中的内置函数加以说明,而是打算说明一些不太一目了然的事情。

当终止条件中涉及不同的变量类型时,通过使用 ===和 !==运算符进行强类型检查是很重要的。

由各部分组成的代码

我本来可以将整个脚本编写为一个函数,但这里我却把代码分割成两个函数。还记得前一篇文章中的“分而治之”规则吗?我这么做正是因为每个函数所起的作用不同。如果您用其它

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号