# PHP
###### tags: `cy`
變數前加$符號
### 輸出
```php
<?php echo?> 或 <?= ?>
也可用
<?php print?>
```
echo 與 print 差異
1. echo 比 print快一點
2. echo 不回傳資料,print永遠回傳1
3. echo,print 都不是一個函數,而是一個結構construct,所以後面的參數不加小括號 `()`
4. echo 可傳入多個參數,print不行
### 型態
#### String
單引號與雙引號:純文字字串建議使用`''`去做文字的包覆(與其他傳統語言不同)
```php
雙引號中的變數會自動代入變數內容
$foo = 2;
echo "foo is $foo\n"; // 結果: foo is 2(換行)
echo 'foo is $foo\n'; // 結果: foo is $foo\n
```
:::info
雙引號串中的內容可以被解釋而且替換,而單引號串中的內容總被認為是普通字符<br>
:::
字串相連使用 `.` 句號
#### Boolean(布林)
$YesNo = TRUE
0與"0" => FALSE <br>
1 與"1" => TRUE
#### TimeStamp(時間戳記)
```php
<?= date("Y-y-M-m-D-d"); ?>
//2020-20-Aug-08-Mon-17
```
#### array
定義方法:
```php
$bloodType[] = 'A';
$bloodType[] = 'B';
或
$bloodType = array('A', 'B');
或
$bloodType = ['A','B'];
$變數名稱[ num ] = value
$變數名稱 = array('key' => value)
$變數名稱['key'] = value //key為字串
ex: $myArray['myName'] = 'Jeremy' 或 $myArray = array('myName'=>'Jeremy');
echo "Hello! My name is ".$myArray['myName']
//輸出=>Hello! My name is Jeremy;
可使用var_dump 或 print_r 檢視陣列或物件內容
```
#### foreach
foreach( 陣列 as 變數名稱 )
將陣列內容一個一個讀進變數名稱
```php
foreach ($season as $key => $value){
echo $key, "=>", $value;
}
```
#### 陣列排序
| 指令 | 意義 |
| -------- | --------------------------- |
| sort() | 以升序對索引陣列排序(字串排列) |
| rsort() | 以升序對索引陣列排序 |
| usort() | 以自訂function排序陣列值 usort($array,"funName") |
| asort() | 根據值,以升序對關聯陣列排序 |
| ksort() | 根據鍵,以升序對關聯陣列排序 |
| arsort() | 根據值,以降序對關聯陣列排序 |
| krsort() | 根據鍵,以降序對關聯陣列排序 |
| natsort | 自然順序算法對給定數組中的元素排序 |
### 定義常數
#### define
`define()`函式宣告常數,常數能是數值的值,包括布林、整數、浮點數和字串,雖然也可以設為資源,但有可能會出現問題。
```php
define("常數名稱",值);
```
* 使用方式-直接用常數名稱不用加雙引號
#### const
#### define 與 const 差異
* define 可用在條件判斷中,不成立的條件中,定義的不生效,成功定義後全域性可用,可表達式賦值
* const 不可用在條件判斷中,不過可定義在class中,不可表達式賦值,必須是標量
### 引用檔案
* include
貼上
* require
更強硬的引用,若出問題會報error並停止執行之後的程式
:::info
(xxx_once)
如果引用過,重複的引用會被忽略
:::
### ERROR顯示設定調整
#### 看設定
```php
phpinfo();
```
#### 路徑
```
/Applications/MAMP/bin/php/php7.4.2/conf/php.ini
```
#### 內容
```
display_errors = On (Xampp預設On MAMP預設Off)
error_reporting = E_ALL(都顯示)
=E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR(只顯示ERROR)
```
* 在程式行前加上`@`,執行時會不顯示該行的錯誤訊息
* 在變數前加上`&`,**量子糾纏** (直接去取指標的值,call by reference)
### 運算子
#### 前後++差別
```php
$x = $y++ // $x=$y,$y++ 先給值再加
$x = ++$y // $y++ ,$x=$y 先加再給值
```
#### && 跟 & 差別
```php
(條件a && 條件b) //條件a不符合 不執行條件b
(條件a & 條件b) //條件a不符合 仍執行條件b
```
***
#### session
`session_start()`<br>
如果要使用session都必須要有這句做啟動
session Data存於伺服器端,使用者透過提交session ID讓server端提取對應的資料
#### cookies
cookies存於用戶端,可用於存放session ID.帳密等資料<br>
缺點是容易被竄改
[session vs cookies](https://medium.com/tsungs-blog/day14-session與cookie差別-eb7b4035a382)
[session vs cookie](https://ithelp.ithome.com.tw/articles/10157724)
#### exit
`exit($status)`<br>
中止腳本的執行,如果沒有status參數要傳入,可以省略括號
```php
header("Location: $url")
exit;
```
[exit](https://www.php.net/exit)
#### 字串處理
* `strlen()` 字串長度,在utf8編碼下中文字佔三個長度
* `mb_strlen( string, "string encoding" )` 加上編碼判斷
<br>
* `strpos($字串,x,y)`從第一個y開始尋找x(y沒定義就是從頭找)
```php
$s="012345671289";
// ^從這個往後找
$pos=strpos($s,"12",2); //8
--
$pos=strpos($s,"xxx"); //false
找不到值會傳回 boolean //(echo gettype $(pos))
```
如果查詢到某值的位置為0,該值會被php判斷成false,解決辦法:`!== false`
```php
$s = "012345671289";
$pos = strpos($s,"012");
if($pos !== false){
echo("found: $pos"); //found:0
}
else{
echo("Not Found");
}
```
[查詢字符串第一次出現的位置](https://stockwfj3.pixnet.net/blog/post/66773997)
<br>
* `substr($字串,x,y)`從第x個字取y個
```php
$s="01234567";
$result=substr($s,3,4);
echo $result;
//3456
```
* `str_reaplace("x","y",$字串)` 把字串裡的x替換成y
```php
$s="01234567";
$result=str_replace("12","-",$s);
echo $result;
//0-34567
```
* `htmlspecialchars($string)` 將字串中HTML符號變成不可執行的文字符 <資安
### function
* `func_get_args()` 可變長度參數的函數
* 以字串間接呼叫function
```php
$p = "test";
echo $p($x); //相當於呼叫 test($x)函數;
```
* function無法讀到function以外的全域變數,除非使用 global
* 如果在function內使用未宣告的全域變數,會自動產生該全域變數,其他的function必須使用global才能使用該變數
php中的方法及類別不分大小寫
```php=
$a = 20;
function myfunction($b) {
print "a=$a"; // '',$a於function內未被定義
$a = 30;
print "a=$a"; // 30
global $a, $c;// $c在這裡被定義為全域變數
print "a=$a"; // 20
return $c = ($b + $a);
}
print myfunction(40) + $c; //60+60=120
```
### 讀寫檔案
* opendir:打開一個目錄
* readdir:返回由opendir() 打開的目錄中的文件名稱
* closedir:關閉由 opendir() 函數打開的目錄
* file_put_contents:快速寫入檔案
* move_uploaded_file:將上傳的檔案移動到新位置
* fopen:打開文件或者URL
* fread:讀取文件
* fwrite/fputs:寫入文件
* fgets:從文件指針中讀取一行
* htmlspecialchars:轉換HTML 特殊符號為僅能顯示用的編碼
### Class
```php
Class Animal{
public $price;
private $_weight;
}
```
#### __construct(建構子)
一旦宣告後就直接執行,經常會用來執行必要動作
#### __destruct(解構子)
這個類別執行結束之後再執行 __destruct 內的動作,經常拿來執行收尾的工作
[interface和implements](https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/242253/)
### 資料庫
#### 連接資料庫
```php
$link = mysqli_connect("host","user","password","database","port","socket")
or die(mysqli_connect_error());
mysqli_query($link, "set names utf8");
mysqli_select_db($link, "資料庫");
//可在mysql_connect前加@可用來停用錯誤訊息
```
#### 關閉連接
```php
mysqli_close($link)
```
#### 選取資料表資料
```php
$sql = "select * from 資料表";
$result = mysqli_query($link, $sql);
```
#### 顯示查詢結果
```php
mysqli_fetch_assoc($result) //使用資料庫欄位取值
echo "ID:{$row['cID']}";
mysqli_fetch_row($result) //使用數字索引取值
echo "ID:{$row[0]}";
mysqli_fetch_array()
mysqli_fetch_object()
```
#### 查詢筆數
```php
mysql_num_rows($result)
```
### MVC架構
* model:對資料庫的存取,異動,檢查
* view:視圖,前端畫面
* controller:路由,流程控制

### .htaccess (路由設定檔)
```
RewriteEngine on
//找尋檔案中的file跟directory
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
//找不到的由瀏覽器來處理
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
```
.htaccess跟Apache共同工作完成一次路徑的解析
### curl
* curl_init() 建立curl連線
* curl_setopt() 設定擷取的url網址
* curl_exec()
* curl_close() 關閉curl連線
```php
$_SERVER['HTTP_HOST']:當前請求的Host頭中的內容(與取得Server的Port)
$_SERVER['SERVER_NAME']:當前運行網頁檔案所在的主機名稱
$_SERVER['REQUEST_URI']:訪問此頁面需要的URL
$_SERVER['PHP_SELF']:當前正在執行的網頁檔案名稱
$_SERVER['QUERY_STRING']:查詢的變數值
```
# 作業
會員系統(session):
首頁 會員頁 登入頁<br>
登入 登出
[session 設定時間](https://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30-minutes)
[session 設定時間](https://blog.longwin.com.tw/2008/10/php-
-session-expire-time-2008/)
trim() 清除字串前後空白
:::info
電特多做
1.MVC版本
2.laravel版本
3.Lab_REST_API 全部做一遍 截圖
:::
電特加油~我們就靠你惹
加油!! :heart_eyes:
(????
有點想睡 超級想睡
傘電!!!
flash man <- Barry Allen 好看
<hr>
## 參考資料
[php筆記](https://hackmd.io/@ETC/BJppieP8z)
[兔子吃肉](https://kknews.cc/zh-tw/news/q4qjy3o.html)
[filesystem函數](https://www.w3school.com.cn/php/php_ref_filesystem.asp)
## 框架(laravel sympfony)