数字的写法
数字分为十进位、八进位与十六进位三种写法:
(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)。