WEB开发网
开发学院WEB开发PHP 用PHP开发健壮的代码:有效地使用变量 阅读

用PHP开发健壮的代码:有效地使用变量

 2008-02-15 18:32:16 来源:WEB开发网   
核心提示:获取源目录中的所有文件名 过滤掉 . 和 .. 目录 检查目标文件是否存在于该目录中 如果文件存在,则获取具有正确大小写的文件名 如果名称不匹配,用PHP开发健壮的代码:有效地使用变量(2),则返回 false 要读取目录的内容,需要使用 readdir() 函数,当反复运行某个脚本时,CPU 活动率会突然上升到 10

  
  获取源目录中的所有文件名
  过滤掉 . 和 .. 目录
  检查目标文件是否存在于该目录中
  如果文件存在,则获取具有正确大小写的文件名
  如果名称不匹配,则返回 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 还有 !== 运算符。只有 PHP 4 中才有这些新型运算符和 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 中的内置函数加以说明,而是打算说明一些不太一目了然的事情。
  
  当终止条件中涉及不同的变量类型时,通过使用 === 和 !== 运算符进行强类型检查是很重要的。
  
  由各部分组成的代码
  我本来可以将整个脚本编写为一个函数,但这里我却把代码分割成两个函数。还记得前一篇文章中的“分而治之”规则吗?我这么做正是因为每个函数所起的作用不同。如果您用其它脚本获取某个目录的内容,那么现在就可以使用方便的实现。我希望您考虑一些事情:想象一下将整个脚本作为一个函数来实现,然后想象调试、测试和重用代码所需的工作。
  
  正确使用循环
  现在看看 foreach 循环,想想为什么不用 for 循环?使用 for 循环要求您知道数组中项的数目 — 需要一个额外的步骤。此外,在处理 PHP 数组时,有可能超出数组边界。也就是说,在数组只有 10 个元素时,试图访问它的第 15 个元素。PHP 的确会给出一个小警告,但据我所知,在一些情况下,当反复运行某个脚本时,CPU 活动率会突然上升到 100% 而服务器性能则连续下降。我建议您尽可能地避免使用 for 循环。

上一页  1 2 3 4  下一页

Tags:PHP 开发 健壮

编辑录入:coldstar [复制链接] [打 印]
赞助商链接