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