# 1. PHP 速成班 {%hackmd QnyEFBdERZebn4iQDXNPnA %} ## 本章重點:了解PHP語法與特性 ## 00 安裝PHP, Apache, MySQL ## 01 HTML中嵌入PHP ### PHP標籤 - 分兩種 - XML樣式: ```php= <? php echo '<p>Order processed.</p>'; ?> ``` - 短樣式: ```php= <? echo '<p>Order processed.</p>'; ?> ``` - 差異:前面是否加上 :<?php ### PHP 陳述式 - 記得加上分號,目的是分隔PHP的陳述式 ### 如何註解? - 單行註解 - // - \# - 多行註解 - /* wordswordswords */ ## 02 存取表單變數 ### 表單變數 - 如何設定變數? - 以$開頭 - e.g. $_GET, $_POST - 如何存取欄位? - $_POST[<strong>'</strong>HTML_TAG'S_NAME<strong>'</strong>] - 用來提交表單有兩種方法: - $_GET and $_POST -> 資料型態為陣列 - $_REQUEST可以取得 $_GET, $_POST資料 - $_SERVER ```php= //用來判斷是否使用post方法 if ($_SERVER["REQUEST_METHOD"] === "POST") ``` - 上述陣列皆為超全域(superglobal) ### 字串串接 - 使用字串串接運算子 => "." - e.g. ``` php= echo htmlspecial($tireqty).'tires'; ``` ### 變數與常數 - 字串分兩種 - 使用雙引號的字串 - PHP會試著求出雙引號字串的數值 - 使用單引號的字串 - 會被視為真正的常數 ## 03 暸解識別碼 ### 就是變數 - 命名規則 - 可以為任意長度 - 可包含字母、數字、底線 - 不可以以數字開頭 - 注意大小寫 - PHP 特點:不要求你在使用變數之前先宣告它們 ## 04 變數型態 - 資料型態 - 分兩類 - 基本型態 - 整數 - 浮點數 - 字串 - 布林 - 陣列 - 物件 - 特殊型態 - NULL - resource - callable - 型態強度 - PHP為弱型態 or 動態語言。 Why? 變數的型態是在它被賦值時才決定的。 ### 型態轉義 - 如何轉換資料的型態? - 跟C語言相同:變數前面加上一對括號,括號裡放入想要的型態 - e.g. ```c= $totalqty = 0; $totalamount = (float) $totalqty; ``` - 第二行代表:取出 $totalqty的數值,並將其轉換型態成float後再存入 $totalamount ### 可變變數 - 可變變數可以讓你動態改變變數的名稱 - 如何使用? - 使用 **$$** - e.g. ```php= $varname = 'tireqty'; $$varname = 5; ``` - 第二行的行為意即,$tireqty = 5 ## 05 宣告與使用常數 - 使用define定義常數 - e.g. ```php= define('TIREPRICE', 100); define('OILPRICE', 10); ``` - 注意:常數名稱是大寫的! - 常數與變數的差異: - 使用時是否需要錢號? - 常數:不需要 - e.g. ```php= echo TIREPRICE; ``` - 如何查看其他常數? - 呼叫phpinfo() - 變數:需要 - e.g. ```php= echo $tireqty; ``` ## 06 了解變數範圍(p.30) - 內建的超全域變數到處皆可見 - 常數被宣告後,必然全域可見 - ?? 在一個腳本中宣告的全域變數可在那整個腳本中被看到,但無法在函式中被看到 - 超全域清單 - | 變數名稱 | 涵義 | |:---------- | :-----------------------| | $_SERVER | server環境變數 | | $_GET | GET方法傳入的變數陣列 | | $_POST | POST方法傳入的變數陣列 | | $_COOKIE | cookie變數陣列 | | $_FILES | 與上傳檔案相關的變數陣列 | | $_ENV | 環境變數陣列 | | $_REQUEST | 所有使用者輸入的資料 | | $_SESSION | session 變數陣列 | ## 07 使用運算子 ### 1. 算數運算子 - 加減乘除 - \+ - \- - \* - \/ - \% ### 2. 字串運算子 - 使用 "**.**" - e.g. ```php= $a = 'I' $b = 'Love' $c = 'You' $result = $a.$b.$c echo $result // 'I Love You' ``` ### 3. 賦值運算子 - 使用: "**=**" - e.g. ```php= $b = 6 + ($a = 5) //$b變數會被設定為11 ``` - 複合賦值運算子 - += - -= - *= - /= - %= - .= - e.g. ```php $a. = $b //$a = $a.$b ``` - 預先及延後遞增與遞減 - e.g. ```php= $a = 4; echo ++$a; //先加1,再賦值 echo $a++; //先賦值,再 ``` - 參考運算子 - 就是同步 - 使用 "**&**" ```php= $a = 5; $b = $a; //如果改變$a的數值,$b並不會改變 $a = 100; //$b仍會是5 //使用參考運算子避免製作副本 $a = 5; $b = &$a; $a = 7; //$a與$b都會變成7 ``` - 可以使用unset 解開$a與記憶體內值7之間的連結 - 即$a不再指向原本儲存數值7的記憶體位置 ### 4. 比較運算子 - 同異 - 同 - \== - 相同 - \=== - 相等 - 即數值相同、型態相同 - 異 - \!= - 不相等 - \!== - 不相同 - \<> - 不相等(比較運算子) - 比大小 - \> - \< - \<= - \>= ### 5. 邏輯運算子 - true of false - NOT - ! - e.g. ``` php= !$b //如果$b是false回傳true,反之亦然 ``` - AND - && - and - e.g. ```php= 優先順序:&& 優先於and ``` - OR - || - OR - XOR - xor ### 6. 位元運算子 - Bitwise Operators - AND - & - OR - | - NOT - ~ - XOR - ^ - 左右位移 - \>> - \>> ### 7. 其他運算子 - 雜項 - 特殊運算子 - new - 用來實例化類別 - -> - 存取類別成員 - 屬性與函式皆可 - 三元運算子 - ?: - e.g ```php= //條件?true時的值:false時的值 ($grade >= ? 'Passed' : 'Falied') ``` - 錯誤抑制運算子 - 用來抑制錯誤 - e.g. ```php= $a = @(57/0) //如果沒有使用@運算子,這一行會出現divide-by-zero的警告。使用運算子後,這個錯誤就會被抑制。 ``` - 執行運算子 - `` - e.g. ```php= $out = `ls -la`; echo $out; ``` - 陣列運算子 - 參考比較運算子 - 注意: - \+ 會對純量執行加法,對陣列執行聯集 - 型態運算子 - instanceof - 用來檢查某個物件是不是某個類別的實例 ## 08 使用變數處理函式 ### 測試與設定變數型態 - 設定變數型態 - gettype() -> php會確定變數型態並回傳型態名稱字串 - gettype() -> php會改變該變數的型態 - e.g. ```php= $a = 56; echo gettype($a);//integer settype($a, 'float'); echo gettype($a);//double ``` - 測試的函式 - is_array() - 檢查變數是不是陣列 - is_double() - 檢查變數是不是浮點數 - is_int() - 檢查變數是不是整數 - is_string() - 檢查變數是不是字串 - is_bool() - 檢查變數是不是布林 - is_object() - 檢查變數是不是物件 - is_resource() - 檢查變數是不是資源 - is_null - 檢查變數是不是null - is_scalar - 檢查變數是不是純量 - is_numeric() - 檢查變數是不是數字或數字字串 - is_callable() - 檢查變數是不是有效函式名稱 - 測試變數狀態 - isset -> 檢查變數是不是存在 - unset -> 移除被傳入的變數 - empty -> 檢查變數是不是非空、非零值 - 轉譯變數 - e.g. ```php= int intval(mixed var[, int base=10]) float floatval(mixed var) string strval(mixed var) ``` ## 09 使用條件式進行決策 ### if - e.g ```php= if ($totalqty == 0){ echo 'You did not order anything on the previous page!' } ``` ### else - e.g ```php= if ($totalqty == 0){ echo "You did not order anything on the previous page!" } else { echo htmlspecialchars($tireqty).' tires<br />' } ``` ### elif - e.g ```php= if ($tireqty < 10){ $discount = 0; } elseif (($tireqty >= 10) && ($tireqty <= 49)){ $discount = 5; } elseif (($tireqty >= 50) && ($tireqty <= 99){ $discount = 10; } elseif $(tireqty >=100){ $discount 15; } ``` ### switch - 與if類似,但它可以讓條件式接收兩個以上的值。 - e.g 先從\$_POST陣列中取出$find ```php= switch ($find){ case "a": echo "<p>Regular customer</p>"; break; case "b": echo "<p>Customers referred by TV advert</p>"; break; case "c": echo "<p>Customer referred by phone directory</p>"; break; case "d": echo "<p>Customer referred by word of mouth.</p>"; break; default: echo "<p>We do not know how this customer found us.</p>"; break; } ``` ## 10 以迭代來重複執行動作 ### while - e.g. ```php= $num = 1; while ($num <= 5){ echo $num."<br />"; $num++; } ``` ### for - 基本用法 - e.g. ```php= for ($distance = 50; $distance <= 250; $distance += 50){ echo $distance; } ``` - 結合可變變數 - e.g. ```php= for ($i=1; $i <= $numnames; $i++){ $temp = "name$i"; echo htmlspecialchars($$temp). } ``` ### foreach - 專門與陣列一同使用 ### do ... while - 至少執行一次 - e.g. ```php= $num = 100; do { echo $num."<br />"; } while ($num < 1); ``` ## 11 跳出控制結構或腳本 ### break - 跳出最近的迴圈,並繼續執行 ### coutinue - 跳出本次迴圈迭代 ### exit - 停止整個PHP腳本 ## 12 使用其他的控制結構語法 ### endif, endswitch, endwhile, endfor, endforeach - e.g. ```php= if ($totalqty == 0){ echo "You did not order anything on the previous page!"; exit; } //使用關鍵字 if , endif取代、大括弧用冒號取代 if ($totalqty == 0): echo "You did not order anything on the previous page!"; exit; endif; ``` ### declare - 目的:設定程式區塊的執行命令 - 只實作兩種執行指令 - ticks - encoding - e.g. ```php= declare(encoding="UTF-8"); ```