---
# System prepended metadata

title: 1. PHP 速成班

---

# 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");
```

    
    
    
    
    
    
    






