• ----:)欢迎访问源码网(:----
    • 首页
    • 博客
    • 学院
    • 下载
    • 论坛
    • 影视
    • 发布源码
    • RSS
    • ITPig
    • 笑话网
    • 百家姓
    • 繁體中文

源码网 - 中国第一源码门户
选择镜像:网通镜像 - 电信主站
  • 首 页
  • 新闻动态
  • 网站运营
  • 网页制作
  • WEB开发
  • 编程开发
  • 图像媒体
  • 操作系统
  • 数据库
  • 服务器
热门搜索 优化 SEO 故事 cms IIS7 MySQL 个人 AdSense 主题推广 | 文章搜索: 高级搜索
会员登录/控制面版您的位置: 学院首页 >> WEB开发 >> PHP 开发 >> PHP入门 >> 详细内容
 

推荐文章

  • 谈谈新手如何学习PHP
  • PHP脚本的8个技巧
  • PHP语法速查表
 
 

热点文章

  • PHP中的cookie
  • 谈谈新手如何学习PHP
  • PHP脚本的8个技巧
  • 二元分词函数的分析
  • PHP5学习笔记 -- Classes and Objects in PHP5
  • ascii码及扩展码
  • php中Cookie的设置与使用
  • fgets函数
  • php调用MSSQL存储过程
  • php新手入门(经验谈)
  • 在Windows下安装MySQL
  • PHP编辑器
 
 

相关文章

  • 代码收藏,asp
  • 根据IP地址自动判断转向分站的代码
  • 获取 Google PR 代码Checksum 算法
  • asp获取alexa排名的代码
  • 校内网代码站你的路在何方
  • 20行代码的天气预报小偷
  • 微软代码和应用程序共享网站MSDN Code Gallery上线
  • 用 PHP 开发健壮的代码(一):高屋建瓴的介绍
 
 

百度搜索

 
 

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

  • 阅览次数:
  • 文章来源: CP整理
  • 原文作者: 不祥
  • 整理日期: 2007-01-25
  • 发表评论
  • 字体大小:
  • 小
  • 中
  • 大

“用 PHP 开发健壮的代码”是关于解决大中型应用程序中的实际问题的系列文章。在本文中,PHP 老手 Amol Hatwar 讨论了如何有效地使用变量。他还演示了如何通过使用 PHP 中可变的变量名来构造配置文件解析器,以便简化脚本配置。
在我的前一篇文章中,我研究了在规划、设计甚至编写代码期间必须考虑的一些因素。在本文中,您将真正接触到实际代码,并可以看到实际运行中的一些东西。如果您还没有看过前一篇文章,那么最好现在就看一看。

正确处理变量
变量与函数是任何计算机语言必不可少的要素。有了变量,您可以将数据抽象化;有了函数,您可以将几行代码抽象化。正如 Bruce Eckel 在他的书籍《C++ 编程思想》中所说的那样,所有编程语言都提供抽象。汇编语言是对底层机器的小抽象。随后的许多所谓的命令式语言(如 Fortran、BASIC 和 C)是对汇编语言的抽象。

编程语言提供的抽象的种类和质量直接关系到您所能解决的问题的复杂程度。理解 PHP 如何处理变量和函数,将有助于您有效地使用它们。

名称里有什么?
就象我在前一篇文章中提到的那样,命名约定和编码约定是重要的。无论您使用什么命名约定,请记住要在项目中严格遵守它。如果您使用应用得最广泛的命名约定,那么您的代码将被更多的人所接受。

对变量进行命名时,在包括脚本时要特别注意不要覆盖正在使用的变量。在大型应用程序中,当增加新的功能时,这是常见的错误根源。防止这一问题的最佳办法就是使用前缀。把变量所在模块的名称缩写作为前缀来使用。例如,如果一个处理投票的模块中有一个保存用户标识的变量,那么您可以将该变量命名为 $poll_userID 或 $pollUserID。

理解 PHP 变量
PHP 是解释型语言。这有许多好处,很快您将学习利用其中的一些。第一个很明显的好处是:它使您省掉了设计-编码-编译-测试周期 — 您在编辑器中编写的任何代码都立即可使用。然而,最重要的好处是您不用担心变量的类型以及如何在内存中管理这些变量。所有分配给脚本的内存在执行完脚本后都由 PHP 自动收回。此外,可以对变量执行许多操作而不必知道变量的类型。清单 1 中的代码在 PHP 中工作十分正常,但在 C 和 Java 语言中会抛出一大堆错误消息:

清单 1. 带变量的样本 PHP 代码

<?php
$myStr = 789696; // An integer.
$myVar = 2; // Another integer.
$myStr = "This is my favorite band: "; // Strings are more fun.
$myStr = $myStr . "U" . $myVar; // Doing this is OK, too.
echo "$myVar\n";
?>



安装完 PHP 后,如要运行运行代码,可首先将该代码保存为一个 .php 文件,再将该文件放置在 Web 服务器上,然后将浏览器指向该文件。更好的办法是安装 PHP 的 CGI 版本。然后,通过在 shell 或命令提示符下输入以下命令,并用包含您的脚本的文件名替代 script-name,这样就可以运行该脚本了。

path-to-php/php script-name




该代码能够正常工作,因为 PHP 是类型宽松的语言。用通俗易懂的英语,可以不考虑变量类型,可以把字符串赋值给整数,以及毫不费力地用较大的字符串替代较小的字符串。这在象 C 这样的语言中是不可能的事情。在内部,PHP 将变量所拥有的数据与类型分开存储。类型存储在单独的表中。每当出现包含不同类型的表达式时,PHP 自动确定程序员想要做什么,接着更改表中的类型,然后自动对表达式求值。

介绍一个常见的小问题
不用担心类型固然很好,但有时那也会使您陷入真正的麻烦。怎么回事呢?这里有一个实际的示例:我常常必须把在基于 Windows 的 PC 上创建的内容移到 Linux 系统,以便能在 Web 上使用它们。基于 Windows 的文件系统在处理文件名时是不区分大小写的。文件名 DefParser.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 还有 !== 运算符。只有 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 中的内置函数加以说明,而是打算说明一些不太一目了然的事情。

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

由各部分组成的代码
我本来可以将整个脚本编写为一个函数,但这里我却把代码分割成两个函数。还记得前一篇文章中的“分而治之”规则吗?我这么做正是因为每个函数所起的作用不同。如果您用其它脚本获取某个目录的内容,那么现在就可以使用方便的实现。我希望您考虑一些事情:想象一下将整个脚本作为一个函数来实现,然后想象调试、测试和重用代码所需的工作。

[1] [2]

上一篇:PHP使用zlib扩展实现页面GZIP压缩输出
下一篇:构建支持Master/Slave读写分离的数据库操作类
  • 网友评论:
  • 查看所有评论
  • 我要发表评论
您的网名:
留言主题:
你要发表的内容:

 

关于本站 | 广告联系 | 版权声明 | 网站地图 | 发布软件 | 帮助中心 | 源码论坛

Copyright © 2005-2007 CodePub.Com  程序支持:木翼  滇ICP备05005971号