该代码可以正常任务,由于 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 设计。鄙人次会晤之前,但愿您编程兴奋!