# PHP 排版
遵循 [PSR-12](https://www.php-fig.org/psr/psr-12/) 、 [中文版](https://learnku.com/docs/psr/psr-12-extended-coding-style-guide/5789)
[PSR 是什麼東西?](https://learnku.com/docs/psr/about-psr/1613)
## 一行
不允許一行塞多組程式碼,**一行只能有一個==分號 ;==**
分號做為結尾緊貼左邊的程式碼,接著只能換下一行
分號右邊不能有多餘的空白
## 二元運算元 ==+ - * / \===
以等號為例
等號 = 的兩邊**最少要有一個空白**,等號左右邊都允許因為排版美觀使用多個空白
```php
//左邊多塞空白
$today_morning = "早上好";
$last_night = "晚上好";
//右邊多塞空白
$today_morning = "早上好";
$last_night = "晚上好";
//就一個空白
$today_morning = "早上好";
$last_night = "晚上好";
```
開放多個空白的目的是為了排版美化,讓等式可以靠左或靠右對齊
不能隨意想空幾個就空幾個讓版面混亂
**不確定的情況下就保持一個空白**
``> < + - * / %`` 等等其他二元運算元同理
## 縮排 ==Tab==
```php
if (false)
echo 'false';
```
PSR 以 **4個空白** 當作縮排,以解決不同系統 Tab 長度不同的問題
已經習慣使用 Tab 的夥伴不用緊張,後面會提供轉換工具自動轉換寫好的程式碼
## 通用小括號內排版 ==( )==
小括號裡面:
**第一個字詞** 貼緊 ==( 左小誇號==
**最後一個字詞** 貼緊 ==) 右小誇號==
多個參數:
==**, 逗號**==**貼緊左邊**的變數,並且逗號右邊要有**一個空白**才接下一個變數
```php
$cseq = substr($cseq7, 0, -1);
```
如果沒有參數時,左小括號貼緊右小括號
```php
my_function();
```
## class類別、function函式
==new== 與 ==class名稱== 距離固定**一個空白**
==( 左小誇號==**左邊貼緊** class、function 名稱
```php
$mysqli = new mysqli($ip, $user, $pass);
```
==->== **緊貼左右兩邊**
```php
$mysqli->query($sql);
```
### 子函式
函式包子函式的寫法時,**最多一層**
舉例:
```php
$tmp_date = substr(trim($start_date), 0, 8);
$start_date = date("Y-m-d", strtotime($tmp_date));
```
**禁止包多層的反人類寫法**
超過2層,數到底要幾個括號很容易出錯,禁止使用
```php
$start_date = date("Y-m-d", strtotime(substr(trim($start_date), 0, 8)));
```
多個參數,允許都用子函式,並無違反上述超過2層原則
```php
$str = substr(trim($str1), 0, count($str2));
```
### ==大括號 { }==
**class、function** 縮排風格為 [Allman 風格](https://zh.wikipedia.org/zh-tw/%E7%BC%A9%E8%BF%9B%E9%A3%8E%E6%A0%BC)
=={ 左大括號==單獨一行
==} 右大括號==單獨一行
```php
function show_data($data)
{
echo '<pre>';
print_r($data);
echo '</pre>';
}
```
#### 參數換行
如果參數很多,要讓參數換行的排版如下:
```php
function TrapeArea(
$upper,
$under,
$high
) {
$area = ($upper + $under) * $high / 2;
return $area;
}
```
參數換行從**第一個參數**就要換行,換行後**縮排**
之後的 ==) {== **會在同一行**,中間固定**一個空白**,**不縮排**
## 流程控制 ==if else 等等==
==字詞 if、else 等等==、==左小括號 (==、==右小括號 )==、==左大括號 {==
固定保持**一個空格**的間距
==右小括號 )==、==左大括號 {== 在同一行
**流程控制** 縮排風格為 [K&R 風格](https://zh.wikipedia.org/zh-tw/%E7%BC%A9%E8%BF%9B%E9%A3%8E%E6%A0%BC)
```php
if (true) {
echo "YA";
}
```
### if else
```php
if ($a > 0 && $a < 5) {
//狀況1
} elseif ($b = 1) {
//狀況2
} elseif ($b = 2) {
//狀況3
} else {
//其他
}
```
**不允許省略大括號{ }**
固定使用==elseif==,**不允許** ==else if==
並且 ==**左大括號 }、下一個判斷式、右大括號 {**== **在同一行**
### switch
```php=
switch ($a) {
case 0:
echo 'First case, with a break';
break;
case 1:
echo 'Second case, which falls through';
// no break
case 2:
case 3:
echo 'Third case, return instead of break';
return;
default:
echo 'Default case';
break;
}
```
### while、for、foreach
```php
while ($a > 0) {
//程式區塊
}
for ($i = 0; $i < 10; $i++) {
//程式區塊
}
foreach ($array as $key => $value) {
//程式區塊
}
```
### do while
```php
do {
//程式區塊
} while ($a > 0);
```
### try catch
```php
try {
//try
} catch (ThrowType $e) {
//catch
} finally {
//finally
}
```
#### 判斷式換行
如果一個小括號 ( ) 裡面有**多個判斷式**
允許判斷式換行:
```php
if (
$a > 0
&& $a < 5
) {
//狀況1
} elseif (
$b = 1
|| $b = 2
) {
//狀況2
}
```
**第一個判斷式就開始換行**,換行後**縮排**
==運算元== &&、|| 等等 固定於**行的開頭**,**不允許放結尾**
之後的 ==) {== **會在同一行**,中間固定**一個空白**,**不縮排**,**單獨一行**
## 單元運算元
==++== 、 ==-\-== **緊貼變數**
```php
$i++;
++$j;
```
型別轉換小括號右邊不強制空白
```php
$a = (int) $b;
$a = (int)$b;
```
## 三元運算元
==?==、==:== 左右兩邊最少要一個空白
當中間的判斷省略時,==?:== 貼緊
```php
$msg = $a > 0 ? '大於零' : '沒大於零';
$msg = $a > 0 ?: '沒大於零';
```
## 程式布局
現有已經在運行的 PHP 程式還並未嚴格切割 ==PHP 程式模組==,==HTML 版面==
暫時依賴人工分割,分割遵循以下布局
```php
<?php
/*
PHP 程式區塊 :
PHP 資料處理、資料庫 SQL、API 串接
統一集中在最前面
*/
?>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<!--
HTML 程式區塊 :
網頁的版型、顯示頁面
這一區禁止出現 PHP 資料處理
只能允許 echo 上面 PHP 處理完的資料內容
如果要穿插在 HTML 中,只能用 <?= ?>
-->
<script>
/*
JavaScript 程式區塊
使用的 JavaScript 通一集中在最底下
不允許穿插在 HTML 裡面
*/
</script>
</body>
</html>
```
==**程式編碼統一使用 UTF-8**==
### PHP 程式區塊 :
最上層的區塊
PHP程式資料處理、資料庫SQL、API串接,集中放在這邊
### HTML 程式區塊 :
中間的區塊
網頁的版型、顯示頁面
這一區 **禁止任何的 PHP 資料處理程式**
只能允許 **輸出** 上面 **PHP 處理完的資料內容**
當要穿插在 HTML 中間時,
==**禁止直接 echo HTML**==
```php
<?php
echo "<form>";
foreach ($input_array as $a => $b) {
echo "<input type='hidden' name='$a' value='$b'>";
}
echo "</form>";
?>
```
==**改為使用 <?= ?> 輸出 PHP 變數內容**==
```php
<form>
<?php
foreach ($input_array as $a => $b) {
?><input type='hidden' name='<?=$a?>' value='<?=$b?>'><?php
}
?>
</form>
```
### JavaScript 程式區塊 :
最下層的區塊
網頁使用的任何 JavaScript 程式碼統一集中在這裡
區塊結束的 </script> 下一行就是 </body>
穿插 PHP 程式碼時
同樣 **禁止直接 echo JavaScript**
使用 **<?= ?>** 輸出 PHP 變數內容
## 排版工具
### 開發環境
編輯器使用 [VSCode](https://code.visualstudio.com)
開發環境安裝 PHP
[macOS](https://www.php.net/manual/zh/install.macosx.php) 安裝 [Homebrew](https://brew.sh/index_zh-tw) 、 [PHP](https://formulae.brew.sh/formula/php)
[Windows](https://www.php.net/manual/zh/install.windows.php) 直接安裝 [XAMPP](https://www.apachefriends.org/zh_tw/download.html)
安裝步驟不贅述
### VSCode 套件
[PHP Intelephense](https://marketplace.visualstudio.com/items?itemName=bmewburn.vscode-intelephense-client)

如圖示:
1.點選方塊打開套件列
2.輸入 `PHP Intelephense` 點選搜尋後出現的區塊
3.右方視窗按下 `安裝`

4.開啟擴充設定

5.搜尋列搜尋 ` php.executablePath`
6.點開 `setting.json`

7.`php.validate.executablePath` 設定本機電腦上安裝的 PHP 檔案位置
圖示中 `C:\\xampp\\php\\php.exe` 為安裝 XAMPP 的 PHP 預設路徑
8.修改後存檔,完成設定
### 使用方法
按下 `F1`

將 `PHP Intelephense` 設定為預設格式器

設定完預設格式後,只要在程式碼中按下 `右鍵`

`格式化文件` 可以將整支程式自動排版
`格式化選取範圍` 可以將匡選的區塊自動排版