php 2007-7-12 21:26
PHP变量的使用
[size=14px]就像大部份的结构化程序,有所谓的全局变量与局部变量,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 的值。
[color=#000000][color=#0000bb]<?php 字串7
[/color][color=#ff8000]// 本程序使用 $GLOBALS 数组
[/color][color=#007700]function [/color][color=#0000bb]myfunc[/color][color=#007700]() {
echo [/color][color=#0000bb]$GLOBALS[/color][color=#007700][[/color][color=#dd0000]"PHP_SELF"[/color][color=#007700]];
}
[/color][color=#0000bb]myfunc[/color][color=#007700]();
[/color][color=#0000bb]?>
[/color][/color]
下面是错误的示范,请勿模仿,上面的才是正确的示范。
[color=#000000][color=#0000bb]<?php
[/color][color=#ff8000]// 这是错误的示范
[/color][color=#007700]function [/color][color=#0000bb]errfunc[/color][color=#007700]() {
echo [/color][color=#0000bb]$PHP_SELF[/color][color=#007700];
}
[/color][color=#0000bb]errfunc[/color][color=#007700]();
[/color][color=#0000bb]?>
[/color][/color]
但是这个错误的示范要是改成下例就没问题了
[color=#000000][color=#0000bb]<?php 字串3
[/color][color=#ff8000]// 本程序使用全局定义
[/color][color=#007700]function [/color][color=#0000bb]myfunc[/color][color=#007700]() {
global [/color][color=#0000bb]$PHP_SELF[/color][color=#007700];
echo [/color][color=#0000bb]$PHP_SELF[/color][color=#007700];
}
[/color][color=#0000bb]myfunc[/color][color=#007700]();
[/color][color=#0000bb]?>
[/color][/color]
在变量前面加上 global 的名称,就是定义该变量为全局变量。用这种方式,就不需使用 $GLOBALS 数组,也能让变量进入自行开发的函数中。
接下来先看静态变量的例子
[color=#000000][color=#0000bb]<?php
[/color][color=#ff8000]// 静态变量的例子
[/color][color=#007700]function [/color][color=#0000bb]myfunc[/color][color=#007700]() {
static [/color][color=#0000bb]$mystr[/color][color=#007700];
[/color][color=#0000bb]$mystr[/color][color=#007700].=[/color][color=#dd0000]"哈"[/color][color=#007700]; 字串4
echo [/color][color=#0000bb]$mystr[/color][color=#007700].[/color][color=#dd0000]"<br>\n"[/color][color=#007700];
}
[/color][color=#0000bb]myfunc[/color][color=#007700](); [/color][color=#ff8000]// 哈
[/color][color=#0000bb]myfunc[/color][color=#007700](); [/color][color=#ff8000]// 哈哈
[/color][color=#0000bb]myfunc[/color][color=#007700](); [/color][color=#ff8000]// 哈哈哈
[/color][color=#0000bb]?>
[/color][/color]
函数在执行时所产生的变量,在函数结束时就消失了,有时因为程序的需要,函数在循环中,当不希望变量在每次执行完函数就消失的话,静态变量(static variable) 就派上用场了。上例中,使用 $mystr 变量之前,先在变量前面加上 static,即表示变量$mystr 是静态变量,当每次执行 myfunc() 函数时,$mystr 的值会一直增加,每执行一次就多一个哈字。若将 static的静态变量定义拿掉,就没办法累加哈字了。
[color=#000000][color=#0000bb]<?php
[/color][color=#ff8000]// 不是静态变量的例子 (错误的) 字串5
[/color][color=#007700]function [/color][color=#0000bb]myfunc[/color][color=#007700]() {
[/color][color=#0000bb]$mystr[/color][color=#007700].=[/color][color=#dd0000]"哈"[/color][color=#007700];
echo [/color][color=#0000bb]$mystr[/color][color=#007700].[/color][color=#dd0000]"<br>\n"[/color][color=#007700];
}
[/color][color=#0000bb]myfunc[/color][color=#007700](); [/color][color=#ff8000]// 哈
[/color][color=#0000bb]myfunc[/color][color=#007700](); [/color][color=#ff8000]// 哈
[/color][color=#0000bb]myfunc[/color][color=#007700](); [/color][color=#ff8000]// 哈
[/color][color=#0000bb]?>
[/color][/color]
再看一个比较实际的例子,它是处理表格的颜色,让隔行的颜色不同。
[color=#000000][color=#0000bb]<?php
[/color][color=#007700]function [/color][color=#0000bb]TdBackColor[/color][color=#007700]() { 字串8
static [/color][color=#0000bb]$ColorStr[/color][color=#007700];
if ([/color][color=#0000bb]$ColorStr[/color][color=#007700]==[/color][color=#dd0000]"808080"[/color][color=#007700]) {
[/color][color=#0000bb]$ColorStr[/color][color=#007700]=[/color][color=#dd0000]"c0c0c0"[/color][color=#007700];
} else {
[/color][color=#0000bb]$ColorStr[/color][color=#007700]=[/color][color=#dd0000]"808080"[/color][color=#007700];
}
return([/color][color=#0000bb]$ColorStr[/color][color=#007700]);
}
echo [/color][color=#dd0000]"<table border=1>\n"[/color][color=#007700];
for ([/color][color=#0000bb]$i[/color][color=#007700]=[/color][color=#0000bb]0[/color][color=#007700]; [/color][color=#0000bb]$i[/color][color=#007700]<[/color][color=#0000bb]10[/color][color=#007700]; [/color][color=#0000bb]$i[/color][color=#007700]++) { 字串3
[/color][color=#0000bb]$ColorStr[/color][color=#007700]=[/color][color=#0000bb]TdBackColor[/color][color=#007700]();
echo [/color][color=#dd0000]"<tr><td bgcolor="[/color][color=#007700].[/color][color=#0000bb]$ColorStr[/color][color=#007700].[/color][color=#dd0000]">这是第"[/color][color=#007700].[/color][color=#0000bb]$i[/color][color=#007700].[/color][color=#dd0000]"行</td></tr>\n"[/color][color=#007700];
}
echo [/color][color=#dd0000]"</table>"[/color][color=#007700];
[/color][color=#0000bb]?>
[/color][/color]
PHP 的变量使用技巧上,最令人觉得不可思议的则是变量的变量 (variable variable)。这是充分利用 PHP 特性玩出的特殊技巧
[color=#000000][color=#0000bb]<?php
$a [/color][color=#007700]= [/color][color=#dd0000]"Hello"[/color][color=#007700];
$[/color][color=#0000bb]$a [/color][color=#007700]= [/color][color=#dd0000]"world"[/color][color=#007700]; 字串3
echo [/color][color=#dd0000]"$a, $hello"[/color][color=#007700]; [/color][color=#ff8000]// Hello, world
[/color][color=#007700]echo [/color][color=#dd0000]"$a, [/color][color=#007700]{[/color][color=#dd0000]$a[/color][color=#007700]}[/color][color=#dd0000]"[/color][color=#007700]; [/color][color=#ff8000]// 也是 Hello, world
[/color][color=#0000bb]?>
[/color][/color]
mdean@kcnet.com 举出一个更绝的例子 (24-Apr-1999),他称为变量的函数 (variable function)
[color=#000000][color=#0000bb]<?php
[/color][color=#007700]function [/color][color=#0000bb]myCallbackFunction[/color][color=#007700]()
{
print([/color][color=#dd0000]"Hello from callback"[/color][color=#007700]);
}
function [/color][color=#0000bb]myFunction[/color][color=#007700]([/color][color=#0000bb]$callback[/color][color=#007700]) [color=#ffffff]字串2[/color]
{
[/color][color=#0000bb]$callback[/color][color=#007700]();
}
[/color][color=#ff8000]// call to myFunction passing callback
// function as parameter
[/color][color=#0000bb]myFunction[/color][color=#007700]([/color][color=#dd0000]"myCallbackFunction"[/color][color=#007700]);
[/color][color=#0000bb]?>
[/color][/color]
至于用户在 FORM 中输入的资料,要怎么处理呢?要是在 PHP 的配置文件中,track_vars 设为 On时,直接使用变量名字就好了。如下例,next.php 在执行时,系统会自动产生两个变量 $username 及$sex,直接使用就好了,比起传统的 CGI 要自己解析,PHP 实在是太神奇了。
<form action=next.php method=post>
姓名: <input type=text name="username"><br>
性别: <input type=text name="sex"><br>
<input type=submit>
</form>
由于 PHP 许多语法都是 C 语言的翻版,故 PHP在使用变量时,随时都可以使用新的变量,只要在使用前将变量初始化就好了,不必像 Pascal语言那样严谨,所有要使用的变量都要事先定义。这当然有好处与坏处:好处是使用方便、自由;坏处就是常常因这些自由而付出相当大的代价调试。在程序码短的PHP 程序当然不成问题,当程序在数百数千行,甚至 include 或 require好几层之后,问题就浮现出来了。无论如何,保持良好的写作习惯才是避免浪费青春的方法。
字串1
[/size]