進階 WWW 程式設計 -- PHP 語言結構 靜宜大學資訊管理學系 蔡奇偉副教授 2003 2019/2/25 進階 WWW 程式設計 PHP 語言結構(一) 靜宜大學資訊管理學系 蔡奇偉副教授 2003 靜宜大學資管系 蔡奇偉編撰 版權所有 2003
內容大綱 註解(Comments) 文數字(Literals) 識別字(Identifiers) 關鍵字(Keywords) 變數(Variables) 常數(Constants) 資料型態(Data Types) 運算子與運算式(Operators & Expressions)
註解(Comments) 範例 註解只是程式中的說明文字,不算是程式執行流程中的一部分。PHP 允許你用以下三種方式加入程式的註解文字: Shell Style: 用字元 # 加入簡短的單行註解文字。 C++ Style: 用雙斜線 // 加入簡短的單行註解文字。 C Style: 用 /* 和 */ 包夾單行或多行的註解文字。 範例 $value = $p * exp($r * $t); # 計算複利 $value = $p * exp($r * $t); // 計算複利 /* 這是一段 多行的註解文字 */
範例 # (//) 的註解範圍起自註解字元 # (//) 終止於斷行字元或目前 PHP 程式段的結束標記 ?>(看先碰到那一個)。 <?php $d = 100; # d 設為 100 ?> 得到的值為:<?php echo $d ?> 註解範圍 上一行程式產生以下的輸出: 得到的值為:100 /* … */ 的註解範圍起自 /* 終止於第一個碰到的 */。因此以下多層次註解方式不被 PHP 所接受: /* $j = 1; $i = 100; /* 註解 */ */
/* … */ 除了用來加入多行的註解文字外,也常在程式的測試階段中用來讓一段程式碼變成註解文字而不發生效力(這個動作稱為「註解掉(comment out)」)。 $i = 100; /* $j = $i + 20; $k = $i * $j; */ $i ++; 範例 這兩行程式碼變成註解而不再被執行
文數字(Literals) 文數字是直接寫在程式之中的常數值,譬如以下是合法的文數字: 整數:2001, 0xFE 字串:’Hello’, “A String”, ‘你好嗎?’ 特殊值:true, false, null
識別字(Identifiers) 識別字簡單來說就是名稱(name)。它是用來對一些 PHP 的物件加以命名,如變數名稱、函式名稱、常數名稱、或類別名稱等等。 識別字必須符合下列的命名規則: 第一個字元必須是英文大小寫字母、底線字元(_)、或 ASCII 碼 0X7F 到 0XFF 之間的字元。 第一個以後的其他字元除了上述以外,還可以是 0 到 9 的阿拉伯數字。
關鍵字(Keywords) 關鍵字是 PHP 程式中具有特殊意義的字。你不能把自定的變數、函式、常數、類別命名成與這些關鍵字同名,否則會造成錯誤。 PHP 的關鍵字可區分為三大類: 語法上的關鍵字,如 if, else, do, true, …, 等等。 特殊變數和常數,如 $argc, $_POST, …, 等等。 內建的 PHP 函式,如 array, echo, …, 等等(非常多) 完整的關鍵字表列請自行參考 PHP 的說明手冊。
變數(Variables) PHP 規定變數的名稱必須以錢號字元($)開頭,使之與其他的名稱有所區分(為了提昇程式的編譯效率)。除了錢號字元開頭外,剩餘的字元則必須符合前述的識別字命名規則。此外,變數名稱的大小寫是有所區別的,也就是說,名稱由相同字母但大小寫不同所組成的兩個變數,會被視為不同的變數。 範例 合法的變數名稱 $amount $this_is_Friday $_here 不合法的變數名稱 $not valid $3Com $@someplace
和 C/C++ 不同,PHP 的變數不需要經過資料型態的宣告,而且可以在不同時間存放不同型態的資料。所以以下幾行的變數連續指定在 PHP 中是完全合法的: $var = 3; # 整數 $var = ‘Hello’; # 字串 $var = array(10, 20, 30); # 陣列 $var = 5; # 整數 當然,為了程式的可讀性,我們應該避免使用同一個變數來儲存多種型態的資料(比如一下拿來存整數,等等又拿來存陣列)。
常數(Constants) 範例 define(name, expression); PHP 程式中的常數是用 define() 函式來定義,其格式如下: define(name, expression); 第一個參數 name 是常數的名稱,命名規則如前述的識別字;第二個參數 expression 是一個常式算式。我們通常用全部大寫來命名常數。 範例 define(PI, 3.1415); echo PI; # 3.1415 define(MESSAGE, “How are you doing?”); echo MESSAGE; # How are you doing?
資料型態(Data Types) PHP 共有八種資料型態,分屬於以下的三大類: 單一值的型態 布林值(boolean) 整數(integer) 浮點數(floating number) 字串(string) 複合值的型態 陣列(array) 物件(object) 特殊的型態 空值:NULL 資源(resource)
布林值(boolean) 布林值代表邏輯上的真假值:true 與 false。在程式中,布林值主要用在條件判斷上。譬如: if ($isOK) { … } 在 PHP 中,只有底下的值被視為 false: 關鍵字 false 整數值 0 浮點數值 0.0 空字串(””)和字串 “0” 沒有任何元素的陣列 沒有任何資料值與函式的物件 空值 NULL 其餘的值則都被視為 true。
整數(integer) 整數的大小範圍 PHP 並沒有硬性規定,而是隨系統而定。不過對目前的三十二位元電腦而言,這個範圍通常是在 -2,147,483,648 和 2,147,483,648 之間。 在程式中,你可以用下面三種整數的表示法: 十進位格式: 2003, -123, +78 十六進位格式(開頭為 0x 或 0X): 0XFF, 0x16, 0xff, -0xABCD 八進位格式(開頭為 0) : 0755, -0123
浮點數(floating number) 浮點數的大小範圍 PHP 並沒有硬性規定,一般而言是和系統的 C 程式語言的 double 相同,約略有15 位有效數字並大小在 1.710-308 和 1.710308 之間(對正數而言)。 在程式中,你可以用下面二種浮點數的表示法: 小數表示法: 3.14, 0.0015, -7.8 科學記號表示法: 0.314E1, 0.314e1, 13.5E-4, -2.1e6
字串(string) 雙引號字串:用雙引號(”)括住的字串。如: 單引號字串:用單引號(’)括住的字串。如: PHP 有以下兩種字串的寫法: ”Thanks God, it’s Friday” 特性: 特殊的字元可以用下一頁的逸出碼(escape sequence)來表示。 可以使用變數名稱來插入其值。 單引號字串:用單引號(’)括住的字串。如: ’Hello, world!’ 只接受兩種逸出碼:\\ (得到 \)和 \’ (得到 ’) 其他字串中的字元全部視同普通字元,而不做任何特殊處理。
雙引號字串中的逸出碼: \n newline \r carriage return \t horizontal tab \\ backslash \$ dollar sign \{ right brace \} left brace \[ right bracket \] left bracket \” double quote \ooo ooo 是 1 至 3 位八進位數所代表的 ASCII 字碼 \xhh hh 是一或二位的十六進位數所代表的 ASCII 字碼
字串範例 指令 輸出 echo ”Don’t stop!”; Don’t stop 指令 輸出 echo ”Don’t stop!”; Don’t stop echo ”<h1 align=\”center\”>”; <h1 align=”center”> echo ”First line\nSecond line”; First line Second line echo ”Ho\x6De”; Home echo ”C:\\Windows”; C:\Windows $value = 100; echo ”The value is $value”; The value is 100 echo ’Don\’t stop!’; Don’t stop echo ’<h1 align=”center”>’; <h1 align=”center”> echo ’First line\nSecond line’; First line\nSecond line echo ’The value is $value’; The value is $value echo ’C:\\Windows’; C:\Windows
陣列(array) PHP 的陣列可用來儲存一組相同或不同型態的資料。PHP 提供下列兩種不同存取方式的陣列: 索引陣列(indexed array) 用一個整數索引來存取陣列中的值。 40 25 3.14 ‘Hello’ 1 2 99 indices 對照陣列(associative array) 用一個字串型態的鍵(key)來存取陣列中的對照值。 ‘lastname’ ‘陳’ ‘firstname’ ‘水扁’ ‘sex’ ‘male’ keys values
陣列的產生方式 一、使用指定敘述 40 50 ?? 20 10 1 2 3 4 $myArray NULL 1 2 3 4 $myArray NULL $myArray[0] = 40; $myArray[1] = 50; $myArray[3] = 20; $myArray[4] = 10; ‘lastname’ ‘陳’ ‘firstname’ ‘水扁’ ‘sex’ ‘male’ keys values $myForm $myForm[‘lastname’] = ‘陳’; $myForm [‘firstname’] = ‘水扁’; $myForm [‘sex’] = ‘male’;
二、使用 PHP 的陣列建構函式: array() $myArray = array(40, 50, NULL, 20, 10); # 建立索引陣列 40 50 NULL 20 10 1 2 3 4 $myArray ‘lastname’ ‘陳’ ‘firstname’ ‘水扁’ ‘sex’ ‘male’ keys values $myForm # 建立對照陣列 $myForm = array(‘lastname’ => ‘陳’, ‘firstname’ => ‘水扁’, ‘sex’ => ‘male’);
空值(NULL) 空值在 PHP 程式中代表什麼值都沒有的一種特殊資料值。在下面三種狀況下,一個變數的值會被視為空值: $var = NULL; # 變數 $var 的值是空值 此變數從未被設定成任何值。 此變數被函式 unset() 給設定成空值,如: unset($var); # 變數 $var 的值變成空值
資源(resource) 資源是用來代表程式外部資源的一種資料型態。我們通常得呼叫特殊的函式來建立與處理資源。比方說,連結某個資料庫系統時,我們可以用下列方式來建立一個資源 $resourse: $resourse = db_connection(); # 註:db_connection() 是虛擬的函式 此後,變數 $resourse 在程式中就代表所連結的資料庫。透過變數 $resourse 我們可以做一些資料庫的操作,如: db_query($resource, $query); # 註: qb_query() 是虛擬的函式 這函式用查詢字串 $query 來存取資料庫。
用來判別資料型態的函式 若你想知道變數 $var 值的型態,可以使用以下的函式來判別: is_bool($var); is_int($var); is_float($var); is_string($var); is_array($var); is_object($var); is_null($var); is_resource($var); 此外,你可以用 var_dump($var) 函式來輸出變數 $var 的值與型態資訊。
運算子與運算式 算術運算子 位元運算子 指定運算子 遞增/遞減運算子 比較運算子 邏輯運算子 字串運算子 型態轉換 其他運算子 運算的結合性與優先序
算術運算子 Example Name Result $a + $b Addition Sum of $a and $b. $a - $b Subtraction Difference of $a and $b. $a * $b Multiplication Product of $a and $b. $a / $b Division Quotient of $a and $b. $a % $b Modulus Remainder of $a divided by $b. -$a negation Multiply $a by -1 +$a assertion The as $a
範例 若二元算術運算子的兩個運算元不同型態的話,PHP 會按照下面的規則自動地轉換型態: 整數 浮點數 整數運算元先轉換成浮點數,然後 再與浮點數運算元做運算 整數 字串 字串運算元先轉換成數值,然後 再與整數運算元做運算 浮點數 字串 字串運算元先轉換成數值,然後 再與浮點數運算元做運算 範例 5 + 4 # 9 (int) 17 + 3.14 # 20.14 (float)
PHP 從字串最左邊開始一個一個字元地轉換成數值,直到碰到無法轉換為止,譬如: 5 + ”3.14” # 8.14 (float) ”9 Lives” – 1 # 8 (int) ”3.14 Pies” * 2 # 6.28 (float) ”1.0E3 Points of Light” + 1 # 1001 (float)
位元運算子 Example Name Result $a & $b And Bits that are set in both $a and $b are set. $a | $b Or Bits that are set in either $a or $b are set. $a ^ $b Xor Bits that are set in $a or $b but not both are set. ~ $a Not Bits that are set in $a are not set, and vice versa. $a << $b Shift left Shift the bits of $a $b steps to the left (each step means "multiply by two") $a >> $b Shift right Shift the bits of $a $b steps to the right (each step means "divide by two")
位元運算絕大部是用在整數運算元上。不過,PHP 也允許你使用字串運算元。 ~$a 若 $a 是字串,則逐個字元運算。 若 $a 和 $b 都是字串,則逐個字元地做運算,而且運算所得的字串,其長度等於 $a 和 $b 中較短者。 $a & $b $a | $b $a ^ $b $a 和 $b 必須都是整數。不是整數的運算元都會先被轉成整數,然後再開始運算。 $a << $b $a >> $b
指定運算子(Assignment Operator) Example Result $a = $b $a is set to be the value of $b $a &= $b $a = ($a & $b) $a += $b $a = ($a + $b) $a |= $b $a = ($a | $b) $a -= $b $a = ($a - $b) $a ^= $b $a = ($a ^ $b) $a *= $b $a = ($a * $b) $a <<= $b $a = ($a << $b) $a /= $b $a = ($a / $b) $a >>= $b $a = ($a >> $b) $a %= $b $a = ($a % $b) $a .= $str $a = ($a . $str)
遞增/遞減運算子 Example Name Effect ++$a Pre-increment Increments $a by one, then returns $a. $a++ Post-increment Returns $a, then increments $a by one. --$a Pre-decrement Decrements $a by one, then returns $a. $a-- Post-decrement Returns $a, then decrements $a by one.
比較運算子 Example Name Result $a == $b Equal TRUE if $a is equal to $b. Identical TRUE if $a is equal to $b, and they are of the same type. (PHP 4 only) $a != $b Not equal TRUE if $a is not equal to $b. $a <> $b $a !== $b Not identical TRUE if $a is not equal to $b, or they are not of the same type. (PHP 4 only) $a < $b Less than TRUE if $a is strictly less than $b. $a > $b Greater than TRUE if $a is strictly greater than $b. $a <= $b Less than or equal to TRUE if $a is less than or equal to $b. $a >= $b Greater than or equal to TRUE if $a is greater than or equal to $b.
我們用以下的例子來說明 == 和 === 以及 != 和 !== 之間的區別: 3.14 == ”3.14” # true 3.14 === ”3.14” # false 3.14 === 3.14 # true 3.14 == ”3.14 Pies” # true 3.14 === ”3.14 Pies” # false 3.14 != ”3.14” # false 3.14 !== ”3.14” # true 3.14 !== 3.14 # false 3.14 != ”3.14 Pies” # false 3.14 !== ”3.14 Pies” # true 3.14 <> ”3.14” # false
比較大小時,運算元可能是:兩者皆為數值、兩者皆為字串、或一為數值另一為字串。下表列出這些組合的比較方法: 第一運算元 第二運算元 比較方法 數值 數值大小 數字串 非數字串 字典序 數字串:數字格式的字串,如:”3.14”, “20”, “1.0e-6”, …, 等等。 非數字串:數字串以外的字串,如:”Hello”, “3 books”, …, 等等。
邏輯運算子 Example Name Result $a and $b $a && $b And TRUE if both $a and $b are TRUE. $a or $b $a || $b Or TRUE if either $a or $b is TRUE. $a xor $b Xor TRUE if either $a or $b is TRUE, but not both. ! $a Not TRUE if $a is not TRUE.
懶惰性的計算(Lazy Evaluation) 在 PHP 驗算邏輯式的過程中,若已經可以確定整個式子的真假值,就不會再計算剩下的部分,這稱之為懶惰性的計算(Lazy Evaluation)。譬如: 1 == 1 or echo ’This is skipped’ true 不會被執行 $result = fopen($filename) or exit(); 若開檔成功,則不會執行 exit();否則就會執行 exit()。 $result = $flag and mysql_connect(); 只有當 $flag 為真時,才會執行 mysql_connect()。
字串運算子 範例 $string1 . $string2 把字串 $string1 和字串 $string2 結合成一個字串 “Hello, “ . “world!” # “Hello, world!” “The value is “ . ‘3’ # “The value is 3” “The value is “ . 3 # “The value is 3” $a = 3.14; “The value is “ . $a # “The value is 3.14” $a = “It’s”; $a .= “ ok.”; # $a 為 “It’s ok.”
型態轉換(Type Casting) 你可以用以下類似 C/C++ 的型態轉換運算子來轉換資料的型態: 運算子 轉換成的型態 (int) 或 (integer) Integer (float) 或 (real) Floating point (bool) 或 (boolean) Boolean (string) String (array) Array (object) Object
其他運算子 範例 條件運算子(? :) (conditional_expr)? true_expr : false_expr 若 conditional_expr 的值為 true,則以 true_expr 為式子的值,否則以 false_expr 為式子的值。 範例 $a = (3 == ‘3’)? ‘equal’ : ‘not equal’; # $a = ‘equal’ $a = (3 === ‘3’)? ‘equal’ : ‘not equal’; # $a = ‘not equal’
範例 錯誤訊息控制運算子(Error Control Operator) 某些 PHP 函式或運算子發現錯誤時會輸出錯誤訊息。你可以在函式或運算子之前加上字元 @ 來取消這些錯誤訊息的輸出。 範例 /* Intentional file error */ $my_file = @file ('non_existent_file') or die ("Failed opening file: error was '$php_errormsg'"); // this works for any expression, not just functions: $value = @$cache[$key]; // will not issue a notice if the index $key doesn't exist.
範例 執行運算子(Execution Operator) `external_command` PHP 會執行反引號(`)所夾住的外部系統指令 external_command,然後傳回執行的結果。 範例 假定 WWW 伺服器使用 Unix 作業系統。底下兩行指令執行後將輸出目前目錄下的檔案表列。 $output = `ls -al`; echo "<pre>$output</pre>";
運算的結合性與優先序 低 高 Associativity Operators left , or xor and right print = += -= *= /= .= %= &= |= ^= ~= <<= >>= ? : || && | ^ & non-associative == != === !== < <= > >= << >> + - . * / % ! ~ ++ -- (int) (float) (string) (array) (object) @ [ new 低 高
PHP 的運算規則是優先序高的運算先計算。當然,你可以用括號 (…) 來改變運算的優先序或結性,如: echo 1 + 2 * 3; # 7 echo (1 + 2) * 3; # 9 echo 1 + (2 + 3) * 4; # 21 優先序相同的運算子並列時,由結合性(associativity)來決定是由左至右(left)或由右至左(right)地運算。如: echo 4 – 2 - 1; # 1 (not 3) echo (int)(float) 3.14; # 3 echo (float)(int) 3.14; # 3.0