当前位置:Linux教程 - Php - PHP中的常量和变量

PHP中的常量和变量

数字的写法

数字分为十进位、八进位与十六进位三种写法:
(1) 1234 - 一般我们习惯的十进制
(2) 01234 - 开头为 0 (zero) 表示这是一个八进制数字
(3) 0x1234 - 开头为 0x (zero eks) 表示这是一个十六进位数字
另外,double (浮点数) 的写法也是和平常的习惯一样,例如:
-12.3 3.5 7.0001 0.0000054 10000.1
这五个数字都是浮点数正确的写法。

PHP 也支持科学记号写法,可用来表示较大或较小的数值,例如:
12.5E-5 (12.5x10-5)
1.3E+3 (1.3x10+3)
分别为 .000125 (0.000125) 与 1300。

字符串的写法

字符串以单、双或倒引号围住分别有不同的义意。
单引号
例如:
$str = ''An apple a day keeps the docter away.''
当字符串出现 '' 符号时,必须加上:
''I''m wing''
应改成:
''I''m wing''
才对,其中 '' 即称为跳脱字符 (escape character)。

双引号

以双引号围住的字符串 PHP 会对该字符串做 variable interpolation 的动作,亦即做变量的取代:
$name = ""Wing"";
echo ''Name: $name'';
echo ""Name: $name"";
执行结果为:
Name: $name
Name: Wing
在双引号里的字符串如果有 $ (dollar sign),只要改成跳脱字元的写法即可:
$total = 12000
echo ""Total: $ $total""; //输出 Total: $ 12000
在做 variable interpolation 时,变量名称是以一个以上空格做为界线,例如:
$n_file = 5;
if ($n_file == 1) {
echo ""There are $n_file."";
} else {
echo ""There are $n_files."";
}
当 $n_file 不为 1 时,""There are $n_files."" PHP 所看到的变量为 $n_files,而不是正确的 $n_file,所以必须改成:
$n_file = 5;
if ($n_file == 1) {
echo ""There are $n_file."";
} else {
echo ""There are {$n_file}s."";
}

单引号内的双引号,或是双引号内的单引号都视为有效字符,不需使用跳脱字符,例如:
echo ""I''m a happy bird."";
echo ''I''m a happy ""bird""!'';
输出结果为:
I''m a happy bird.
I''m a happy ""bird""!

反引号

利用反引号可以执行 UNIX 下的命令,并传回执行结果。例如:
echo ``ls -l *.txt``;
表示将 ls -l *.txt 命令的执行结果输出,以反引号围住的字符串为要执行的 UNIX 指令。

如何使用 PHP 的类型

PHP 的变量属松散资料类型,变量的类型是在计算时动态 (dynamic) 决定的PHP 的松散资料类型,即我们给定什么值,该变量即为什么类型,或是如何使用该变量,该变量即为适当的类型,例如:

$foo = ""0""; $foo 为 string (ASCII 48)
$foo++; $foo 变成 string ""1"" (ASCII 49)
$foo += 1; $foo 变成 integer (2)
$foo = $foo + 1.3; $foo 变成 double (3.3)
$foo = 5 + ""10 Little Piggies""; $foo 为 integer (15)
$foo = 5 + ""10 Small Pigs""; $foo 为 integer (15)

字串类型转数值类型

当我们给变量的值是利用双引号括住数值或字符串时,就是指定一个字符串给变量,例如:
$a = ""Hello!"";
$a 变量为字符串类型。请看底下的范例:
$a = ""hello!"";
echo $a;
?>

输出结果为:
hello!

PHP 的变量是在执行时才决定类型,因为字符串也可以用来做计算,很奇怪吧!PHP 将字符串拿来做运算时,会依据底下二个原则设法将字符串转成可以计算的类型:

字符串中包括 "".""、""e"" 或 ""E"" 时转换成 double 类型,否则转换为integer 无法转换时则为 0

范例:
$foo = 1 + ""10.5""; $foo 为 double (11.5)
$foo = 1 + ""-1.3e3""; $foo 为 double (-1299)
$foo = 1 + ""bob-1.3e3""; $foo 为 integer (1)
$foo = 1 + ""bob3""; $foo 为 integer (1)
$foo = 1 + ""10 Small Pigs""; $foo 为 integer (11)
$foo = 1 + ""10 Little Piggies""; $foo 为 integer (11)
$foo = ""10.0 pigs "" + 1; $foo 为 int (11)
$foo = ""10.0 pigs "" + 1.0; $foo 为 double (11)

Type Juggling (类型转换竞争)

变量在做运算时,例如使用 ""+"",当 expression 包含各种不同的类型时,就会有 Type Juggling 的动作发生,例如:
$foo = ""0""; $foo 为 string ""0"" (ASCII 48)
$foo++; $foo 为 string ""1"" (ASCII 49)
$foo += 1; $foo 变成 integer (2)
$foo = $foo + 1.1; $foo 变成 double (3.1)
$foo = 5 + ""15 Persons""; $foo 的运算结果为 integer (20)
$foo = 5 + ""10 Big Pigs""; $foo 的运算结果为 integer (15)
又如:
$a = 5; // $a 的类型为 integer
$a[0] = ""Hi!""; // $a 的类型变成 array
这种类别的改变即称为 ""Type Juggling""。

局部变量

在 function 里初始化的变量即局部变量。为什么叫局部变量呢?因为局部变量只有在 function 里可以被「看见」,请看底下的范例:
function sum() {
$a = 1;
$b = 2;
echo $a+$b;
}
echo ""
"". $a;
sum();
执行结果:
3
0

第二个输出的结果为 0,这是因为 function 里的 $a 只有在 function 里才能被看到,在 function 外局部变量就不能被看见。

全局变量

在局部变量范围之外所宣告的变量即全局变量,例如:
$a = 1;

function sum() {
echo $a;
}

sum();
这段程序代码执行后不会有任何输出,可是 $a 不是一个全局变量吗?请记得一点,因为 PHP 的变量是不须经过宣告的,所以 function 里的 $a 其实仍然是一个局部变量。

局部变量的可见度会盖掉全局变量,所以 sum() 所 echo 出的 $a 变量是一个局部变量,那该如何告诉 function 变量是一个全局变量呢?利用 global 关键词即可:
$a = 1;

function sum() {
global $a;

$a = $a*100;
}

sum();
echo $a;
执行结果:
100

第一段程序代码其实存在了二个变量,一个是全局变量 $a,另一个则是局部变量 $a。在第二段程序代码里,则只有一个全局变量 $a。

对于全局变量另外一个重点就是,倒底全局变量的范围为何?在 PHP 里,全局变量也称为 page-scoped 变量,亦即在同一个档案里的 PHP 程序都能看到这个全局变量。

静态变量

局部变量生命期是在函数执行期间,随函数的执行结束而结束,而静态变量的生命期是随整个 PHP 程序结束而结束,但可见度只有该函数。利用关键词 static 来宣告静态变量:
function sum() {
static $a = 1;

if ($a < 10) {
echo $a;
$a++;
sum();
}

sum();
输出结果:
123456789

区部或全局变量都不是静态变量,因为函数执行结束后,变量的值并不会被保留。而所谓的静态变量意思就是说,当函数执行结束后,该变量的值仍然会被保留,因此第二次函数该函数时,静态变量之前的值仍然存在。
变量的定义
使用者自定变量可使用 define() 函数,这些变量定义后,包括 PHP 里事先定义好的变量,都不能再被重新定义。例如我们要定义 PI 变量的值为 3.14159:
define(""PI"", 3.14159);
echo PI; // 输出为 3.14159
这里的 ""PI"" 被我们定义成常数,因此以后只要提到 PI,指的就是 3.14159,例如:
echo PI*10;

输出结果等于 31.4159 (3.14159*10)。