### PHP 4 完全中文手册

变量类型

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 的值。

<?php
// 本程序使用 $GLOBALS 数组
function myfunc() {
echo $GLOBALS["PHP_SELF"];
}
myfunc();
?>

下面是错误的示范，请勿模仿，上面的才是正确的示范。

<?php
// 这是错误的示范
function errfunc() {
echo $PHP_SELF;
}
errfunc();
?>

但是这个错误的示范要是改成下例就没问题了

<?php
// 本程序使用全局定义
function myfunc() {
global $PHP_SELF;
echo $PHP_SELF;
}
myfunc();
?>

在变量前面加上 global 的名称，就是定义该变量为全局变量。用这种方式，就不需使用 $GLOBALS 数组，也能让变量进入自行开发的函数中。

接下来先看静态变量的例子

<?php
// 静态变量的例子
function myfunc() {
static $mystr;
$mystr.="哈";
echo $mystr."<br>\n";
}
myfunc(); // 哈
myfunc(); // 哈哈
myfunc(); // 哈哈哈
?>

函数在执行时所产生的变量，在函数结束时就消失了，有时因为程序的需要，函数在循环中，当不希望变量在每次执行完函数就消失的话，静态变量 (static variable) 就派上用场了。上例中，使用 $mystr 变量之前，先在变量前面加上 static，即表示变量 $mystr 是静态变量，当每次执行 myfunc() 函数时，$mystr 的值会一直增加，每执行一次就多一个哈字。若将 static 的静态变量定义拿掉，就没办法累加哈字了。

<?php
// 不是静态变量的例子 (错误的)
function myfunc() {
$mystr.="哈";
echo $mystr."<br>\n";
}
myfunc(); // 哈
myfunc(); // 哈
myfunc(); // 哈
?>

再看一个比较实际的例子，它是处理表格的颜色，让隔行的颜色不同。

<?php
function TdBackColor() {
static $ColorStr;
if ($ColorStr=="808080") {
$ColorStr="c0c0c0";
} else {
$ColorStr="808080";
}
return($ColorStr);
}
echo "<table border=1>\n";
for ($i=0; $i<10; $i++) {
$ColorStr=TdBackColor();
echo "<tr><td bgcolor=".$ColorStr.">这是第".$i."行</td></tr>\n";
}
echo "</table>";
?>

PHP 的变量使用技巧上，最令人觉得不可思议的则是变量的变量 (variable variable)。这是充分利用 PHP 特性玩出的特殊技巧

<?php
$a = "Hello";
$$a = "world";
echo "$a, $hello"; // Hello, world
echo "$a, {$a}"; // 也是 Hello, world
?>

mdean@kcnet.com 举出一个更绝的例子 (24-Apr-1999)，他称为变量的函数 (variable function)

<?php
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 实在是太神奇了。

<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 好几层之后，问题就浮现出来了。无论如何，保持良好的写作习惯才是避免浪费青春的方法。