该代码能够正常工作,因为 php 是类型宽松的语言。用通俗易懂的英语,可以不考虑变量类型,可以把字符串赋值给整数,以及毫不费力地用较大的字符串替代较小的字符串。这在象 c 这样的语言中是不可能的事情。在内部,php 将变量所拥有的数据与类型分开存储。类型存储在单独的表中。每当出现包含不同类型的表达式时,php 自动确定程序员想要做什么,接着更改表中的类型,然后自动对表达式求值。
介绍一个常见的小问题 不用担心类型固然很好,但有时那也会使您陷入真正的麻烦。怎么回事呢?这里有一个实际的示例:我常常必须把在基于 windows 的 pc 上创建的内容移到 linux 系统,以便能在 web 上使用它们。基于 windows 的文件系统在处理文件名时是不区分大小写的。文件名 defparser.php 和 defparser.php 指向 windows 上的同一文件。在 linux 操作系统上,它们指向不同的文件。您可能提倡文件名要么全用大写,要么全用小写,但最好的做法应该是使大小写保持不变。
<?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); }
// these are new variables. echo "$mystr "; echo "$i "; echo "$am/n";
// now for the moment of truth ...";
$am = "exaggerating.";
// does it work the other way? echo "$mystr "; echo "${$mystr} "; echo "${${$mystr}}/n "; ?>
首先,清单 4 中的代码声明了名为 $mystr 的变量,并将字符串 i 赋给它。接下来的语句定义了另一个变量。但这次,变量的名称是 $mystr 中的数据。$$mystr 是一种告诉 php 产生另一个变量的方法,其意思是“我想要一个变量,可以在变量 $mystr 中找到这个变量的名称”。当然,为做到这一点,必须定义 $mystr。所以,现在您有一个名为 i 的变量,并用字符串 am 给它赋值。接下来的语句做了同样的事情,并将字符串 great 赋给名为 am 的变量。而 am 只是变量 i 中的数据。
/* give the filename with path info whenever possible. */ function conf_parse($file_name) {
// @ in front makes the function quiet. error messages are not printed. $fp = @fopen($file_name, "r") or die("cannot open $file_name");
while ($conf_line = @fgets($fp, 1024)) { $line = ereg_replace("#.*$", "", $line); // do stripping after hashes. if ($line == "") continue; // drop blank lines resulting from the previous step. list($name, $value) = explode ('=', $line); // drop '=' and split. $name = trim($name); // strip spaces. $$name= trim($value); // define the said variable. } fclose($fp) or die("can't close file $file_name"); } ?>
用正则表达式除去 # 号。尽管这里的表达式很简单,但要知道复杂的正则表达式会消耗大量的 cpu 时间。此外,为每页反复地解析配置文件不是一个好的决策。更好的选择是:使用变量或定义语句将已解析的输出存储为 php 脚本。我倾向于使用 define() 函数进行定义,因为一旦设置了值就不能在运行时更改它。可以在参考资料中找到一个能够根据您的需要加以修改的实现。
结束语 既然知道了如何有效地使用变量,那么您可以着手编写一些较大的程序了。在本系列的下一篇文章中,我将研究函数和 api 设计。在下次见面以前,希望您编程愉快!