Download presentation
Presentation is loading. Please wait.
1
PHP5與MySQL 入門學習指南 凱文瑞克 著 第 8 章 變數
2
本章大綱 8-4 動態變數 8-5 預設變數 8-6 變數的型態轉換 8-7 讀取外部變數 問題與討論 8-1變數命名 8-2 設定初始值
8-2-1 傳值設定 (assign by copy) 8-2-2 傳址設定 (assign by reference) 8-3 變數的種類 8-3-1 區域變數 8-3-2 全域變數 8-3-3 靜態變數 8-4 動態變數 8-5 預設變數 8-6 變數的型態轉換 8-7 讀取外部變數 問題與討論
3
8-1變數命名 一個程式中因為各種計算的不同而需要不同個數的變數。 既然變數不只一個, 我們就必須對不同的變數給予不同的名稱以做為區別。
命名規則如下: 變數一定以 ‘$’ 為第一個字元 第二個字元必須為字母或底線(‘_’) 第二個字元以後可以是下列字元的任意組合 底線 大寫、小寫英文字母 數字 ASCII 碼127 to 255
4
變數命名的範例 變數名稱 說明 $name 合法 $Name 合法。但與$name是二個不同的變數 $_getScore
$number6_person $Put_score $ABC $6person 不合法, 第二字元必須為字母或底線 $get-score 不合法, 不可以有’-‘字元
5
一個好的變數命名會讓程式在開發及之後維護會變的更加方便
在變數名稱上必須要儘量給予一個比較容易瞭解意義的名稱。舉例來說: $A = $B * $C ; 另一個例子: $Area = $Length * $ Width ; $A 是 $B 和 $C 的乘積?! 計算面積 (Area) = 長 (Length) X 寬(Width) 一個好的變數命名會讓程式在開發及之後維護會變的更加方便
6
8-2 設定初始值 變數必須指定其初始值, 如果變數沒有設定初始值則其內容為空的。
簡單的範例: 1. $A =1 ; // $A的值被設定為 $B=12.3 ; // $B的值被設定為 $C=”How are you” ; // $C的值被設定為一個字串 變數的初始值不但決定的變數的內容, 同時也決定變數的資料型態 第一行設定 $A 這個變數內容為 1, 資料型態為一個整數 (integer)。第二行$B的初始值被設定為12.3的實數。$C 為字串變數。
7
變數值的設定上有二種方式: 指定立即值 指定運算式 將一個資料型態的值存入變數中 例如 將運算式計算的結果複製到變數中 $A = 10 ;
$B = “Hello” ; $C = ; 指定運算式 將運算式計算的結果複製到變數中 $A = $X*$Y+2 ; $B = $C ; $C=10+20 ;
8
1: <html> 2: <title>變數設定初始值</title> 3: <body> 4: <?php 5: echo "第一種立即值 <br>" ; 6: $A = 10 ; 7: $B = 12.3 ; 8: $C = "Hello" ; 9: echo "A = $A <br> B = $B <br> C = $C" ; 10: ?> 11: <p> 12: <?php 13: echo "第二種運算式 <br>" ; 14: $D=$A+$B ; 15: $E=$C." My friend" ; 16: echo "D = A + B = $D <br> E = $E" ; 17: ?> 18: </body> 19: </html> 第 6-8 行將 $A、$B 和 $C 設定立即值, 且資料型態分別為整數、浮點數和字串。第 行 $D 和 $E 則是以運算式的結果設定為變數的初始值, 資料型態分別為浮點數及字串。
9
8-2-1 傳值設定(assign by copy)
變數傳遞時也有兩種傳遞設定值的方式, 分別是傳值設定與傳址設定兩種方式。 傳值設定就是將立即值或表示式運算所得的結果複製到變數中。 $A=$B 是使用傳值設定, 會將 $B 的內容複製到目的變數 $A 中。
10
傳值設定(assign by copy) $A=$B, 因為是複製的方式, 因此一共有二個內容相同的獨立變數。也就是說, 以後無論是 $A 或是 $B 的內容改變都不會影響到對方。
11
1: <html> 2: <title>傳值設定</title> 3: <body> 4: <?php 5: $A=10 ; 6: $B=$A ; 7: $B=$B+10 ; 8: echo "\$A=$A <br>" ; 9: echo "\$B=$B" ; 10: ?> 11: </body> 12: </html> 第 5 行$A的初始值為 10, 然後第 6 行將 $A 的內容複製給 $B。第 7 行$ B的內容加 10 後, 第 8-9 行顯示 $A 和 $B 的值, 此時可以發現兩的變數的內容並不相同, 也就是說, 複製後兩個變數是相互獨立的個體並不相關。
12
8-2-2 傳址設定(assign by reference)
這種方式並不是使用複製內容的方式。傳址設定的方法不會複製變數的內容而是存入變數的記憶體位址。 二個變數指向同一個記憶體空間。 若是要使用傳址設定的方式則必須在變數前再加上一個 ’&’ 字元表示取得的是變數的位址而並非變數的內容
13
傳址設定(assign by reference)
二個變數指向同一個記憶體空間。就好像每一個人都有自己的名字和身分證字號是一樣的。不管是使用名字或身分證字號實際上都是指同一個人。
14
1: <html> 2: <title>變數值設定</title> 3: <body> 4: <?php 5: $A = 10 ; // $A的值為10 6: $B = $A ; // $A的值複製給$B 7: $C = &$A ; // $A的記憶體位置給$C 8: echo "執行計算前 <br>"; 9: echo "A=$A <br>" ; 10: echo "B=$B <br>"; 11: echo "C=$C <p>"; 12: $B=$B+10 ; // $B的值加10 13: $C=$C+20 ; // $C的值加20 14: echo "執行計算後:<br>" ; 15: echo "A=$A <br>"; 16: echo "B=$B <br>" ; 17: echo "C=$C "; 18: ?> 19: </body> 20: </html> 第 6 行是將 $A 的值複製給 $B, 因此 $B 的值為 10。第 7 行 ’&’ 字元表示取出$A的位址給 $C, 此時 $C 會同時指向 $A 的記憶體空間。也就是說, $A和 $C 指向同一個記憶空間。第 8-11 行顯示計算之前各變數的值. 第 12 行 $B的內容加 10, $B 就等於 20。第 13 行因為 $C 指向 $A, 所以 $C 加20 就相當於 $A 的內容加20。此時 $A 的內容就變成 30, 而 $C 指向 $A 所以值亦為30 (其實就是 $A 的值) 。第 行顯示計算之後各變數的值.
15
8-3 變數的種類 在程式中因為名種不同的需求而必須要撰寫自定函數 (function)。因此會使得程式碼在邏輯上被分割成不同的區域。
每一個函數就相當於是一個小區域, 那麼在最外層的包含這些函數的就是主程式。 全域變數與區域變數 全域變數可以在整個程式範圍內使用 區域變數只能在函數內自己使用, 不能被其他函數使用 靜態變數
16
8-3-1 區域變數 區域變數就是在函數中定義使用的變數。它的使用範圍只有在函數本身內使用。 函數一 函數二 主程式
17
1: <html> 2: <title>區域變數</title> 3: <body> 4: <?php 5: $A = 1 ; // 全域變數 6: $B = 2 ; // 全域變數 7: echo "A = $A <p>" ; 8: echo "B = $B <p>" ; 9: Function MyFunction(){ 10: $C=10 ; // 區域變數 11: $D=20 ; // 區域變數 12: echo "C = $C <P>" ; 13: echo "D = $D <p>" ; 14: } 15: MyFunction() ; 16: ?> 17: </body> 18: </html> 第 5-6 行 $A、$B 為全域變數其值為 1 及 2. 第 7-8 行顯示 $A, $B 的值, 但是在函數中並不認識這兩個變數。第 9-14 行 Function MyFunction() 內的 $C 為區域變數其值為 10, $D 為區域變數其值為 20, 所以第 行會顯示 10 及 20。 第 15 行執行自訂函數 MyFunction().
18
1: <?php 2: Function MyFunction(){ 3: echo "<< 在函數中 >> <br>" ; 4: echo "設定前: <br>"; 5: echo "A = $A <br>" ; 6: echo "B = $B <p>" ; 7: $A=10 ; // 區域變數 8: $B=20 ; 9: echo "設定後: <br>"; 10: echo "A = $A <br>" ; 11: echo "B = $B <p>" ; 12: } 13: ?> 14: <html> 15: <title>區域變數</title> 16: <body> 17: <?php 18: $A = 1 ; // 全域變數 19: $B = 2 ; // 全域變數 20: MyFunction() ; 21: echo "<< 在函數外 >> <br> "; 22: echo "A = $A <br>" ; 23: echo "B = $B <p>" ; 24: ?> 25: </body> 26: </html> 全域變數使用的範圍從第 行. 第 行設定全域變數 $A, $B. 第 20 行呼叫自訂函數 MyFunction(). 第 3-6 行嘗試直接列印 $A, $B, 由圖 中可以看出這二變數沒有任何內容. 第 7-8 行設定區域變數 $A, $B 為 10及 20. 第 9-11 行顯示區域變數的內容. 第 行顯示全域變數 $A, $B 的內容.
19
8-3-2 全域變數 在 PHP 中全域變數無法直接在函數中使用。在函數中使用全域變數可以在函數內宣告變數為全域變數
宣告全域變數的方法有兩種: global 宣告 GLOBALS 陣列
20
global 使用範例 宣告全域變數 1: <?php 2: Function MyFunction() {
3: global $A,$B ; 4: $A=$A+10; 5: $B=$B+10; 6: } 7: ?> 8: <html> 9: <title>全域變數</title> 10: <body> 11: <?php 12: $A=1 ; 13: $B=2 ; 14: echo "呼叫函數前 :<br>" ; 15: echo "A = $A <br>" ; 16: echo "B = $B <hr width=200 align=left>" ; 17: MyFunction() ; 18: echo "呼叫函數後 :<br>" ; 19: echo "A = $A <br>" ; 20: echo "B = $B <p>" ; 21: ?> 22: </body> 23: </html> 宣告全域變數
21
1: <?php 2: Function SUM(){ 3: global $A,$B,$C ; 4: $C = $A+$B ; 5: echo "在 SUM() 中 \$C = $C <p>" ; 6: } 7: Function AVG() { 8: global $C ; 9: $C = $C/2 ; 10: echo "在 AVG() 中 \$C = $C"; 11: } 12: ?> 13: <html> 14: <title>全域變數</title> 15: <body> 16: <?php 17: $A=1 ; 18: $B=2 ; 19: $C=0 ; 20: SUM() ; 21: AVG() ; 22: ?> 23:</body> 24: </html> global 使用範例 第 1-12 行定義二的自訂函數 SUM() 和 AVG(). 第 3 行 SUM 函數宣告 $A、$B 及 $C 為全域變數, 所以第 4 行經計算後$C的值為 3。第 8 行 AVG 函數宣告 $C 為全域變數, 可取得 $C 的值為 3。經計算後 $C 的值為 1.5。
22
GLOBALS 使用範例 1: <?php 2: Function MyFunction() { 3: $GLOBALS["C"]=$GLOBALS["A"]+$GLOBALS["B"] ; 4: } 5: ?> 6: <html> 7: <title>GLOBALS陣列</title> 8: <body> 9: <?php 10: $A=1 ; 11: $B=2 ; 12: $C=0 ; 13: MyFunction() ; 14: echo "\$A=$A , \$B=$B , \$C=$C" ; 15: ?> 16: </body> 17: </html> 讀取全域變數 利用 $GLOBALS 陣列。陣列中以變數名稱做為 index, 就可以取得全域變數的值。例如 $GLOBALS[“A”] 就是取得 $A 的值。
23
GLOBALS 使用範例 1: <?php 2: Function MyFunction() { 3: $GLOBALS["A"]=$B+10 ; 4: } 5: ?> 6: <html> 7: <title>GLOBALS陣列</title> 8: <body> 9: <?php 10: $A=1 ; 11: $B=2 ; 12: MyFunction() ; 13: echo "\$A=$A , \$B=$B" 14: ?> 15: </body> 16: </html> 第 3 行 $B 並沒有用 $GLOBALS 陣列, 而且在函數中並沒有被設定初始值, 所以 $B 並沒有任何值存在。$A 的值經計算後被存入為 10。函數中並沒有設定 $B 為全域變數, 因此全域變數$B的值仍然保持為 2 並沒有改變。
24
8-3-3 靜態變數 靜態變數祇能夠使用在函數中, 它的目的就是讓區域變數的值不會因為函數結束而消失。
區域變數的生命週期是從函數開始時產生, 當函數結束時立即消滅。為了要保存區域變數的值, 可以使用靜態變數(Static)。
25
1: <?php 2: Function addone() { 3: $I=0 ; 4: $I=$I+1 ; 5: echo "\$I = $I<br>" ; 6: } 7: ?> 8: <html> 9: <title>區段變數生命週期</title> 10: <body> 11: <?php 12: addone() ; 13: addone() ; 14: addone() ; 15: ?> 16: </body> 17: </html> 第 2-6 行宣告了一個 addone() 函數, 其功能是將 $I 設定為 0, 然後將$I的值加 1. 第 行呼叫 addone() 三次, 所以如圖 8- 出現三次 $I=1. $I 是一個區域變數因此當 addone() 執行完後, $I 就被刪除不存在。等到下一次執行 addone() 時又重新開始產生一個新的 $I。也就是說, 區域變數的生命週期是從函數開始時產生, 當函數結束時立即消滅。
26
設定static 1: <?php 1: <?php 2: Function addone() {
4: $I=$I+1 ; 5: echo "\$I = $I<br>" ; 6: } 7: ?> 8: <html> 9: <title>區段變數生命週期</title> 10: <body> 11: <?php 12: addone() ; 13: addone() ; 14: addone() ; 15: ?> 16: </body> 17: </html> 1: <?php 2: Function addone() { 3: static $I=0 ; 4: $I=$I+1 ; 5: echo "\$I = $I<br>" ; 6: } 7: ?> 8: <html> 9: <title>區段變數生命週期</title> 10: <body> 11: <?php 12: addone() ; 13: addone() ; 14: addone() ; 15: ?> 16: </body> 17: </html> 設定static
27
8-4 動態變數 一般來說, 宣告變數時都是使用固定的名稱。例如 $name 是一個代表姓名的變數
動態變數的方式可以讓變數的內容變成一個新的變數 在變數前面再加上一個 “$” 即可成為動態變數 例: $$name=”Lee” ;
28
動態變數範例 $name=”John” ; $$name=”Lee” ;
再合併就變成 $John=”Lee” 所以這樣的寫法就有二個變數了。一個是 $name 其值為 ”John” , 一個是 $John 其值是 ”Lee”。那麼所謂的動態變數就是 $name 的內容改變後, $$name 隨之代表另一個變數.
29
1: <html> 2: <title>動態變數</title> 3: <body> 4: <?php 5: $name="John" ; 6: $$name="Lee" ; 7: echo "\$name= ".$name."<br>"; 8: echo '$$name= '.$$name."<br>" ; 9: $name="Mary" ; 10: $$name="Wang" ; 11: echo "\$name= ".$name."<br>"; 12: echo '$$name= '.${$name}."<p>" ; 13: $name="John" ; 14: echo '$name 重新設為 John <br> $$name內容為' ; 15: echo $$name."<p>" ; 16: echo "三個變數分別為: <br>"; 17: echo "\$name = $name <br>" ; 18: echo "\$John = $John <br>" ; 19: echo "\$Mary = $Mary " ; 20: ?> 21: </body> 22: </html>
30
4: <?php 5: $name="John" ; 6: $$name="Lee" ; 7: echo "\$name= ".$name."<br>"; 8: echo '$$name= '.$$name."<br>" ; 9: $name="Mary" ; 10: $$name="Wang" ; 11: echo "\$name= ".$name."<br>"; 12: echo '$$name= '.${$name}."<p>" ; 13: $name="John" ; 14: echo '$name 重新設為 John <br> $$name內容為' ; 15: echo $$name."<p>" ; 16: echo "三個變數分別為: <br>"; 17: echo "\$name = $name <br>" ; 18: echo "\$John = $John <br>" ; 19: echo "\$Mary = $Mary " ; 由圖中執行的結果中我們可以看到一共有三個變數分別為 $name, $John 和 $Lee。一開始第 5 行 $name 的內容為 ”John”, 然後第 6 行動態變數 $$name 設定的一個新的變數 $John其內容為 ”Lee”。第 7-8 行將 $name, $$name 的內容顯示在網頁.
31
4: <?php 5: $name="John" ; 6: $$name="Lee" ; 7: echo "\$name= ".$name."<br>"; 8: echo '$$name= '.$$name."<br>" ; 9: $name="Mary" ; 10: $$name="Wang" ; 11: echo "\$name= ".$name."<br>"; 12: echo '$$name= '.${$name}."<p>" ; 13: $name="John" ; 14: echo '$name 重新設為 John <br> $$name內容為' ; 15: echo $$name."<p>" ; 16: echo "三個變數分別為: <br>"; 17: echo "\$name = $name <br>" ; 18: echo "\$John = $John <br>" ; 19: echo "\$Mary = $Mary " ; 第 9 行 $name 又被設定為 ”Mary”, 所以第 10 行 $$name 不再是代表 $John 而是 $Mary, 而且其值為 ”Wang”。 第 行將 $name, $$name 的內容顯示在網頁.
32
4: <?php 5: $name="John" ; 6: $$name="Lee" ; 7: echo "\$name= ".$name."<br>"; 8: echo '$$name= '.$$name."<br>" ; 9: $name="Mary" ; 10: $$name="Wang" ; 11: echo "\$name= ".$name."<br>"; 12: echo '$$name= '.${$name}."<p>" ; 13: $name="John" ; 14: echo '$name 重新設為 John <br> $$name內容為' ; 15: echo $$name."<p>" ; 16: echo "三個變數分別為: <br>"; 17: echo "\$name = $name <br>" ; 18: echo "\$John = $John <br>" ; 19: echo "\$Mary = $Mary " ; 在第 13 行又將 $name 設定為 ”John”, 在這個時候 $$name 又變成了 $John 變數。第 15 行自然就顯示出 $John 的內容 ”Lee”。 所以在這個程式中一共有三個變數分別為 $name、$John、$Mary, 程式的最後第 行將這三個變數的值顯示出來。
33
1:<html> 2: <title>動態變數寫法</title> 3: <body> 4: <?php 5: $name="John" ; 6: $$name="Lee" ; 7: echo "1. $$name <br>" ; 8: echo "2. ${$name} <br>" ; 9: echo "3. ".$$name."<br>" ; 10: echo "4. ".${$name} ; 11: ?> 12: </body> 13: </html> 除了第一種方法以外都可以取得 $John 的內容。第7行第一種方式因為寫在文字串中, $$name 會被看成 ”$”+ 變數 ”$name”=”$John”。 第 8 行第二種寫法因為加上了大括弧所以可以取得 $John 的內容 Lee。第 9-10 行第三、四種寫法因為沒包含在文字串中所以比較不會有混淆的情形出現。當然第四種寫法是最不容易混淆。
34
8-5 預設變數 PHP.INI 中一個參數 register_globals , 它是設定環境變數, GET 變數, PUT 變數, Cookie 變數以及伺服器變數是否為全域變數. 若 register globals 設定為 on 就表示各變數均為全域變數, 在程式中就可以直接使用. 例如 echo $HTTP_USER_AGENT ; register globals 預設為 off, 不讓設計師直接使用這些變數. 如果要使用這些變數就必需藉由 $_ENV, $_GET, $_POST, $_Cookie 和 $_SERVER 陣列, 取得變數內容. 例如取得 HTTP_USER_AGENT 就必須藉由_SERVER陣列. echo $_SERVER[‘HTTP_USER_AGENT’]
35
部分 $_SERVER 陣列中內容 ‘PHP_SELF’ 目前執行的檔案名稱 ‘SERVER_NAME’ 伺服器的名稱
‘SERVER_SOFTWARE’ 伺服器使用的軟體 ‘DOCUMENT_ROOT’ 文件的根目錄 ‘HTTP_USER_AGENT’ 使用者相關資訊 ‘REMOTE_ADDR’ 遠端使用者的位址 ‘REMOTE_PORT’ 遠端使用者的連線埠 在取得變數內容時, 以變數名稱為陣列指標即可取得資訊. 例如 SERVER_NAME 則可以以 $_SERVER[‘SERVER_NAME’] 取得資訊.
36
使用PHP預設變數 1: <?php 2: echo "目前執行的檔案名稱 ". $_SERVER['PHP_SELF']. "<br>"; 3: echo "伺服器使用的軟體 ". $_SERVER['SERVER_SOFTWARE']. "<br>"; 4: echo "文件的根目錄 ". $_SERVER['DOCUMENT_ROOT']. "<br>"; 5: echo "使用者相關資訊 ". $_SERVER['HTTP_USER_AGENT']. "<br>"; 6: echo "遠端使用者的位址 ". $_SERVER['REMOTE_ADDR']. "<br>"; 7: echo "遠端使用者的連線埠 ". $_SERVER['REMOTE_PORT']. "<br>"; 8: ?>
37
8-6 變數的型態轉換 PHP 變數的使用並不需要宣告資料型態。變數的資料型態是由初始值的資料型態來決定。 變數的資料型態轉換有兩種方式
在設定變數值的時候強迫轉換資料的型態。 使用函數將變數的資料型態轉化為新的型態。
38
強迫轉換資料的型態 格式如下: 變數=(資料型態) 運算式或變數 不管設定值最後的型態為何, 變數的型態都會變成小括弧中所指定的資料型態。
不管設定值最後的型態為何, 變數的型態都會變成小括弧中所指定的資料型態。 我們來看下面幾個例子: 例如: $a=(int) (7/2) ; //$a=3 $b=12.3 $c=(int)$b; //$c=12 因為(int)使得運算的結果強迫換為整數, 所以變數 $a 的值為 3 而不是 3.5. 同理 $c 的內容為 12. 由上述說明運算式及變數都可以轉換為新的資料型態.
39
可強迫轉換型態的有 l int | integer l bool | boolean l float | double | real l string l array l object
40
gettype() 函數的功能是取得變數的資料型態.
1: <html> 2: <title>資料型態的轉換</title> 3: <body> 4: <? 5: $A= ; 6: $B=(int)$A ; 7: $C=(double)123 ; 8: $D="100" ; 9: $E=(int)$D ; 10: echo "\$A = $A Type is ".gettype($A)."<br>" ; 11: echo "\$B = $B Type is ".gettype($B)."<br>" ; 12: echo "\$C = $C Type is ".gettype($C)."<br>" ; 13: echo "\$D = $D Type is ".gettype($D)."<br>" ; 14: echo "\$E = $E Type is ".gettype($E)."<br>" ; 15: ?> 16: </body> 17: </html> gettype() 函數的功能是取得變數的資料型態.
41
1: <?php 2: $a=32.1; 3: echo “轉換前: a=$a <br>”; 4: $a=(int)$a; 5: echo “轉換後: a=$a <br>”; 6: echo “變數 a 的屬性 : “; 7: var_dump($a); 8: echo “<p>”; 9: $b=12; 10: echo “轉換前: b=$b <br>”; 11: $b=(int)($b/5); 12: echo “轉換後: b=$b <br>”; 13: echo “變數 b 的屬性 : “; 14: var_dump($b); 15: echo “<p>”; 16: $c=12.3; 17: echo “轉換前: c=$c <br>”; 18: $c=(string)$c; 19: echo “轉換後: c=$c <br>”; 20: echo “變數 c 的屬性 : “; 21: var_dump($c); 22: echo “<p>”; 23: $d=”12345”; 24: echo “轉換前: d=$d <br>”; 25: $d=(int)$d; 26: echo “轉換後: d=$d <br>”; 27: echo “變數 d 的屬性 : “; 28: var_dump($d); 29: echo “<p>”; 30: ?> 第 2-3 行設定變數 a 的內容回一個浮點數 32.1 並顯示轉換前的值. 第 4 行將 $a 的內容轉換為整數. 第 5 行顯示轉換後的值. 第 7 行 var_dump 顯示變數的型態及內容. 第 9-10 行設定變數 b 的內容回一個整數 12 並顯示轉換前的值. 第 11 行將 $b 的內容除以 5, 得到的值應該為 2.4, 但是轉換資料型態後, $b 的值變為 2, 請特別注意, 在做運算式轉換時必須將運算式以括弧將運算式括起來表示運算完畢後才做資料型態轉換. 第 行顯示轉換後的值及變數的型態及內容. 第 行將浮點數轉換成字串, 請記得 $c 變成字串後就不可以做數值運算, 例如乘除. 第23-29 行將文字”12345” 轉換為整數. 和 $c 不同, $d 可以做數值運算, 但是不可以做字串處理.
42
使用函數來轉換變數的資料型態 gettype() 函數來取得變數的資料型態, settype() 則是用來設定變數的資料型態。settype() 格式如下: settype(變數, 新的資料型態) 第一個參數是欲改變型態的變數名稱, 第二個參數是變數的新資料型態. 當轉換成功, 函數會傳回一個True, 反之為False. 下面幾個例子來說明函數的使用方法: settype($A,integer) ; //將變數轉為整數型態 settype($A,float) ; //將變數轉為浮點數型態 settype($A,string) ; //將變數轉為字串型態
43
可被轉換的新資料型態如下: l boolean | bool l integer l float l string l array l object l NULL 讀者請比較函數和第一種方法的強迫轉態, 在整數和浮點數資料型態的使用上稍有差異請特別注意。
44
1: <html> 2: <title>資料型態的轉換</title> 3: <body> 4: <?php 5: $A= ; 6: settype($A,integer) ; 7: $B=100 ; 8: settype($B,string) ; 9: $B=$B."abc"; 10: echo "\$A = $A Type is ".gettype($A)."<br>" ; 11: echo "\$B = $B Type is ".gettype($B)."<br>" ; 12: ?> 13: </body> 14: </html> 使用函數來轉換變數的資料型態
45
8-7 讀取外部變數 互動式網頁最大的特色就是和使用者溝通,最重要的問題就是如何取得使用者的輸入的資訊。
讀取使用者輸入的資訊只是 PHP 由外部輸入變數的其中一種功能而已。 除了取得使用者資訊外, 伺服器資訊、Cookie、Session 等等對 PHP 來說都是屬於外部變數或是全域變數。
46
全域變數陣列 陣列名稱 說明 $GLOBALS 目前程式碼範圍中有效的變數。 $_SERVER 和伺服器有關的變數,
陣列名稱 說明 $GLOBALS 目前程式碼範圍中有效的變數。 $_SERVER 和伺服器有關的變數, $_GET 利用HTTP GET方式傳回的變數 $_POST 利用HTTP POST 方式傳回的變數 $_COOKIE 利用HTTP COOKIE 方式傳回的變數。請參閱第 18 章 $_FILES 上傳檔案時的變數 $_ENV 環境變數。請參閱 phpinfo()中 PHP Variables $_REQUEST 讀取任何一種使用者輸入方式的變數 $_SESSION 讀取已註冊的SESSION變數 。請參閱第 18 章
47
互動式的網頁製作 由使用者端輸入所需的資訊 HTML 表單輸入 PHP的$_GET及$_POST陣列
48
<html> <title>表單輸入</title> <body> <b>凱文瑞克公司線上訂購系統 <p></b> ======= 客戶資料 =======<p> <form action="extra.php" method="get"> 公司名稱 <INPUT TYPE=TEXT NAME=company SIZE=20><p> 公司地址 <INPUT TYPE=TEXT NAME=address SIZE=20><p> 訂購產品數量 <INPUT TYPE=TEXT NAME=amount SIZE=5><p> <INPUT TYPE=SUBMIT value=" 填好了 "> <INPUT TYPE=RESET VALUE=" 重填 "; </form> </body> </html> 輸入公司名稱、電話號碼和訂購數量。 在輸入完畢後三個資料分別以company、address和amount三個名稱傳回伺服器中給表單所指定的PHP程式
49
1: <html> 2: <title>取得外部變數</title> 3: <body> 4: <?php 5: echo $_GET['company'] ."您好: <p>" ; 6: echo "感謝貴公司訂購本公司產品". $_GET['amount'] ."個," ; 7: echo "貨款共".($_GET['amount']*100)."元整.<p>" ; 8: echo "貨品將於三日內送達$_GET['address']<p>" ; 9: echo "再次感謝您的愛護.<p>" ; 10: echo "凱文瑞克公司 敬上" ; 11: ?> 12: </body> 13: </html> 取得外部傳回的變數值 由執行結果可以看到三個變數我們並沒有設定其初始值, 而其內容是由HTML表單所傳回來的資料存入。當然在PHP程式中變數的名稱必需和HTML表單中的名稱相同。確認網頁中顯示公司的名稱、公司的地址以及訂購的數量, 並依訂購的數量計算出應付的貨款。
50
1: <html> 2: <title>Text</title> 3: <body> 4: <form action="8-24.php" method=get> 5: <input type=text name=str1><p> 6: <input type=text name=str2 size=30><p> 7: <input type=text name=str3 size=50 value="Hello my friend"><p> 8: <input type=submit value=" OK "> 9: <input type=reset value="Reset"> 10: </form> 11: </body> 12: </html> 輸入 3 個文字串, 分別是 str1、str2 和 str3。其中分別設定 size 和 value 屬性。 表單以 GET 的方式傳送給 8-24.php。
51
2: echo "str1 = ".$_GET['str1']." <br>";
範例8- 24 1: <?php 2: echo "str1 = ".$_GET['str1']." <br>"; 3: echo "str2 = ".$_GET['str2']." <br>"; 4: echo "str3 = ".$_GET['str3']." <br>"; 5: ?> 接收 8-23.htm 傳來的資料。因為是採用 GET 的方式所以要用 $_GET['str1'] 取得 外部變數 $str1 的內容。同樣的 Password 也可以讀的到。 1: <html> 2: <title>Text</title> 3: <body> 4: <form action="8-24.php" method=get> 5: <input type=text name=str1><p> 6: <input type=text name=str2 size=30><p> 7: <input type=text name=str3 size=50 value="Hello my friend"><p> 8: <input type=submit value=" OK "> 9: <input type=reset value="Reset"> 10: </form> 11: </body> 12: </html>
52
1: <html> 2: <title>Radio</title> 3: <body> 4: <form action=8-26.php method=get> 5: <input type=radio name=r1 value=1>選項A <br> 6: <input type=radio name=r1 value=2>選項B <br> 7: <input type=radio name=r1 value=3>選項C <br> 8: <p> 9: <input type=radio name=r2 value=1>選項X <br> 10: <input type=radio name=r2 value=2>選項Y <br> 11: <p> 12: <input type=radio name=r3 value=1 checked>選項O <br> 13: <input type=radio name=r3 value=2>選項P <br> 14: <input type=radio name=r3 value=3>選項Q <br> 15: <input type=submit value=" OK "> 16: <input type=reset value=" Reset "> 17: </form> 18: </body> 19: </html> 8-25.htm Radio 為單選, 所以同一個群組 (例如第 5-7 行)不管有幾個 Radio 選項, 它的名稱 (Name) 都必須相同。如果不同代表相異群組。當然同一群組只會傳一個值回去。
53
範例8- 26 1: <?php 2: echo "r1 = ".$_GET['r1']." <p>"; 3: echo "r2 = ".$_GET['r2']." <p>"; 4: echo "r3 = ".$_GET['r3']." <p>"; 5: ?> 接收 8-25.htm 傳來的資料。因為是採用 GET 的方式所以要用 $_GET['r1'] 取得 外部變數 $r1 的內容。每一組只有一個回傳值。
54
範例8- 27 1: <html> 2: <title>Check</title> 3: <body> 4: <form action=8-28.php method=get> 5: <input type=checkbox name=c1 value=1>選項A<p> 6: <input type=checkbox name=c2 value=2>選項B<p> 7: <input type=checkbox name=c3>選項C<p> 8: <input type=checkbox name=c4 checked>選項D<p> 9: <input type=submit value=" OK "> 10: <input type=reset value=" Reset "> 11: </form> 12: </body> 13: </html> Checkbox 為複選, 恰巧與 Radio 相反。所以一個 Check 選項, 它都必須擁有不相同的名稱 (Name)。當然一個 Checkbox 都會傳一個值回去。
55
2: echo "AAA ==> ".$_GET['c1']." <p>";
範例8- 28 1: <?php 2: echo "AAA ==> ".$_GET['c1']." <p>"; 3: echo "BBB ==> ".$_GET['c2']." <p>"; 4: echo "CCC ==> ".$_GET['c3']." <p>"; 5: echo "DDD ==> ".$_GET['c4']." <p>"; 6: echo "<hr>"; 7; ?> 接收 8-27.htm 傳來的資料。因為是採用 GET 的方式所以要用 $_GET['c1'] 取得 外部變數 $c1 的內容。每一個選項就有一個回傳值。 以上範例是採用 method=get 所以我們都採用 $_GET[] 陣列來取得變數值。如果 meth0d=post 請記得要用 $_POST[] 陣列來取得變數值。
56
問題與討論 請說明變數命名的規則。 何謂傳值設定與傳址設定? 二者有何不同。 請改寫第五章問題9並撰寫程式顯示使用者輸入的姓名、性別及嗜好。
請說明變數的種類。 何謂區域變數與全域變數? 請說明global與$GLOBALS[]的使用方法。 何謂變數生命週期? 何謂靜態變數? 何謂動態變數? 請說明轉換變數資料型態的二種方法。 請說明外部變數有哪些型式。
Similar presentations