Jollen 網路學院
|| Jollen 的 Embedded Linux 訓練方案 | Jollen 的 Embedded Linux 系列著作 ||
□ Jollen網路學院 >> PHP 讀者服務 >> PHP 線上教材 □

CH8: PHP 常數與變數

在這篇文章裡,你可以學到:

  • 數字的寫法
  • 字串的寫法
  • 如何使用 PHP 的資料型態
  • 字串型態轉數值型態
  • Type Juggling (型態轉換競爭)
  • 區域變數
  • 全域變數
  • 靜態變數
  • 常數的定義

數字的寫法

數字分為十進位、八進位與十六進位三種寫法:

(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 將字串拿來做運算時,會依據底下二個原則設法將字串轉成可以計算的型態:

  1. 字串中包括 "."、"e" 或 "E" 時轉換成 double 型別,否則轉換為 integer
  2. 無法轉換時則為 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)。

PHP 線上教材
· CH1: 什麼是 PHP
· CH2: PHP 的用途
· CH3: PHP 的優點
· CH4: Hello, world!
· CH5: 如何安裝 PHP
· CH6: PHP 入門觀念
· CH7: PHP 基本語法
· CH8: PHP 常數與變數
· CH9: PHP 函數設計
· CH10: PHP 運算元
· CH11: PHP Expression
· CH12: PHP 陣列
· CH13: PHP Class設計
· CH14: PHP 良好習慣
回首頁 |  TOP |
    Copyright (c) 2006 www.jollen.org
All rights reserved. 更新日期: 2006/04/11