數字的寫法 數字分為十進位、八進位與十六進位三種寫法:
(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 Jollen'
應改成:
'I\'m Jollen'
才對,其中 \' 即稱為跳脫字元 (escape character)。
雙引號
以雙引號圍住的字串 PHP 會對該字串做 variable interpolation
的動作,亦即做變數的取代:
$name = "Jollen";
echo 'Name: $name';
echo "Name: $name";
執行結果為:
Name: $name
Name: Jollen
在雙引號裡的字串如果有 $ (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 變數為字串型態。請看底下的範例:
<?php
$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 "<br>". $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)。 |