PHP4手册:语法(二) 常量与变量
--------------------------------------------------------------------------------
常数型态
--------------------------------------------------------------------------------
PHP 在常数中定义了以下一些常数。
__FILE__
这个内定常数是 PHP 程式档名。若引用档案 (include 或 require)则在引用档案内的该常数为引用档案名,而不是引用它的档案名。
__LINE__
这个内定常数是 PHP 程式行数。若引用档案 (include 或 require)则在引用档案内的该常数为引用档案的行,而不是引用它的档案行。
PHP_VERSION
这个内建常数是 PHP 程式的版本,如 '3.0.8-dev'。
PHP_OS
这个内建常数指执行 PHP 剖析器的作业系统名称,如 'Linux'。
TRUE
这个常数就是真值 (true)。
FALSE
这个常数就是伪值 (false)。
E_ERROR
这个常数指到最近的错误处。
E_WARNING
这个常数指到最近的警告处。
E_PARSE
本常式为剖析语法有潜在问题处。
E_NOTICE
这个常式为发生不寻常但不一定是错误处。例如存取一个不存在的变数。
这些 E_ 开头形式的常数,可以参考 error_reporting() 函式,有更多的相关说明。
当然在程式写作时,以上的内定常数是不够用。define() 的功能可以让我们自行定义所需要的常数。见下例
define("COPYRIGHT", "Copyright © 1999, Wilson Peng");
echo COPYRIGHT; // 送出 "Copyright © 1999, Wilson Peng" 字串。
?>
--------------------------------------------------------------------------------
变数型态
--------------------------------------------------------------------------------
PHP 的变数型态不多,有以下五种:
string
integer
double
array
object
string 即为字串变数,无论是单一字元或数千字的字串都是使用这个变数型态。值得注意的是要指定字串给字串变数,要在头尾加上双引号 (例如: "这是字串")。在欲让字串换行时,可使用溢出字元,也就是反斜线加上指定的符号,若是 \x 加上二位数字,如 \xFE 即表十六进位字元,详见下表:
符号 意义
\" 双引号
\\ 反斜线
\n 换行
\r 送出 CR
\t 跳位 (TAB)
integer 为整数型别。在 32 位元的作业系统中,它的有效范围是 -2,147,483,648 到 +2,147,483,647。要使用 16 进位整数可以在面加 0x。
double 为浮点数型别。在 32 位元的作业系统中,它效范围是 1.7E-308 到 1.7E+308。
array 为阵列变数,可以是二维、三维或者多维阵列,其中的元素也很自由,可以是 string、integer 或者 double,甚至是 array。
object 为物件变数,目前在 PHP 中的物件不多,若论及物件,Microsoft 的 ASP 物件仍然较 PHP 的内定物件多,相信这有赖大家的努力。不过话又说回来,Web CGI 程式要求的是效率,以完全物件导向的方式,恐怕使用者在浏览时也会因为程式执行速度慢而很不耐烦吧。
要使用变数,只要在英文字串前面加个钱号 $ 即可,目前变数名称仍不能使用中文。至于变数的大小写是不一样的,对开发 PHP 程式的 TEAM 来说,最好使用相同的变数使用风格,以免届时因为变数大小的问题,花许多无谓的时间去找寻问题点,那就麻烦了。
以下为变数的使用范例:
$mystring = "我是字串";
$WilsonPeng = "真是认真的作者";
$NewLine = "换行了\n";
$int1 = 38;
$int2 = 49;
$hexint = 0x10;
$float1 = 1.732;
$float2 = 1.4E+2;
$MyArray1 = array("子", "丑", "寅", "卯");
$MyArray2 = array(
"地支" => array("子", "丑", "寅", "卯"),
"生肖" => array("鼠", "牛", "虎", "兔"),
"数字" => array(1, 2, 3, 4)
);
物件的使用上就比较麻烦了,要先宣告类别,甚至必须先要方法,方可使用物件,如下例:
class foo {
function do_foo () {
echo "Doing foo.";
}
}
$bar = new foo;
$bar -> do_foo ();
更多有关物件的讨论,参考 物件
此外,还有布林值 (boolean),通常 1 即为 true,0 为 false。
在变数之间,若要转换型态,在 PHP 程式中是很自由的,直接就拿来用了,不必经过特殊的转换函式。当然,浮点数转成整数就有点牵强了,不过可以将浮点数转成字串,也是很好处理。
--------------------------------------------------------------------------------
变数的使用
--------------------------------------------------------------------------------
就像大部份的结构化程式,有所谓的全域变数与区域变数,PHP 在这方面也是有相同的处理方式。
在 PHP 的程式执行时,系统会在记忆体中保留一块全域变数的区域。实际运用时,可以透过 $GLOBALS["变数名称"] 将需要的变数取出。在使用者自定的函式或程序中,就可以用 $GLOBALS 阵列取出需要的变数。当然别忘了 PHP 的变数有分大小写,搞错了大小写可是叫一百年,变数也不会出来。
$GLOBALS 阵列是 PHP 程式中比较特殊的变数,不必宣告,系统会自动匹配相关的变数在里面。在函式中,也不必管 $GLOBALS 阵列是否已经做全域宣告,就可以直接使用了。
和 $GLOBALS 变数类似的还有 $php_errormsg 字串变数。若 PHP 的设定档 (php.ini/php3.ini) 中的 track_errors 选项打开的话,会有全域变数 $php_errormsg 可以看到错误的讯息。
在 PHP 中,全域变数的有效范围 (scope) 仅限于主要程式中,不会影响到函式中同名的变数,也就是全域变数与区域变数互不侵犯。若要变数能通透到函式中,就要用到 $GLOBALS 阵列或是使用 global 宣告。
例如,在自行开发的函式中,要取得目前执行 PHP 程式页面的档名,就可以用 $GLOBALS["PHP_SELF"] 取出 $PHP_SELF 的值。
// 本程式使用 $GLOBALS 阵列
function myfunc() {
echo $GLOBALS["PHP_SELF"];
}
myfunc();
?>
下面是错误的示范,请勿模仿,上面的才是正确的示范。
// 这是错误的示范
function errfunc() {
echo $PHP_SELF;
}
errfunc();
?>
但是这个错误的示范要是改成下例就没问题了
// 本程式使用全域宣告
function myfunc() {
global $PHP_SELF;
echo $PHP_SELF;
}
myfunc();
?>
在变数前面加上 global 的名称,就是宣告该变数为全域变数。用这种方式,就不需使用 $GLOBALS 阵列,也能让变数进入自行开发的函式中。
接下来先看静态变数的例子
// 静态变数的例子
function myfunc() {
static $mystr;
$mystr.="哈";
echo $mystr."
\n";
}
myfunc(); // 哈
myfunc(); // 哈哈
myfunc(); // 哈哈哈
?>
函式在执行时所产生的变数,在函式结束时就消失了,有时因为程式的需要,函式在回圈中,当不希望变数在每次执行完函式就消失的话,静态变数 (static variable) 就派上用场了。上例中,使用 $mystr 变数之前,先在变数前面加上 static,即表示变数 $mystr 是静态变数,当每次执行 myfunc() 函式时,$mystr 的值会一直增加,每执行一次就多一个哈字。若将 static 的静态变数宣告拿掉,就没办法累加哈字了。
// 不是静态变数的例子 (错误的)
function myfunc() {
$mystr.="哈";
echo $mystr."
\n";
}
myfunc(); // 哈
myfunc(); // 哈
myfunc(); // 哈
?>
再看一个比较实际的例子,它是处理表格的颜色,让隔行的颜色不同。
function TdBackColor() {
static $ColorStr;
if ($ColorStr=="808080") {
$ColorStr="c0c0c0";
} else {
$ColorStr="808080";
}
return($ColorStr);
}
echo "\n";
for ($i=0; $i<10; $i++) {
$ColorStr=TdBackColor();
echo "
这是第".$i."行
\n";
}
echo " ";
?>
PHP 的变数使用技巧上,最令人觉得不可思议的则是变数的变数 (variable variable)。这是充分利用 PHP 特性玩出的特殊技巧
$a = "Hello";
$$a = "world";
echo "$a, $hello"; // Hello, world
echo "$a, {$a}"; // 也是 Hello, world
?>
mdean@kcnet.com 举出一个更绝的例子 (24-Apr-1999),他称为变数的函式 (variable function)
function myCallbackFunction()
{
print("Hello from callback");
}
function myFunction($callback)
{
$callback();
}
// call to myFunction passing callback
// function as parameter
myFunction("myCallbackFunction");
?>
至于使用者在 FORM 中输入的资料,要怎么处理呢?要是在 PHP 的设定档中,track_vars 设为 On 时,直接使用变数名字就好了。如下例,next.php 在执行时,系统会自动产生二个变数 $username 及 $sex,直接使用就好了,比起传统的 CGI 要自己剖析,PHP 实在是太神奇了。
由于 PHP 许多语法都是 C 语言的翻版,故 PHP 在使用变数时,随时都可以使用新的变数,只要在使用前将变数初始化就好了,不必像 Pascal 语言那样严谨,所有要使用的变数都要事先宣告。这当然有好处与坏处:好处是使用方便、自由;坏处就是常常因这些自由而付出相当大的代价除错。在程式码短的 PHP 程式当然不成问题,当程式在数百数千行,甚至 include 或 require 好几层之后,问题就浮现出来了。无论如何,保持良好的写作习惯才是避免浪费青春的方法。