# 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) ![](https://i.imgur.com/AyGm6VS.png) 如圖示: 1.點選方塊打開套件列 2.輸入 `PHP Intelephense` 點選搜尋後出現的區塊 3.右方視窗按下 `安裝` ![](https://i.imgur.com/dwW7YwU.png) 4.開啟擴充設定 ![](https://i.imgur.com/lqNMyc2.png) 5.搜尋列搜尋 ` php.executablePath` 6.點開 `setting.json` ![](https://i.imgur.com/QSNncAC.png) 7.`php.validate.executablePath` 設定本機電腦上安裝的 PHP 檔案位置 圖示中 `C:\\xampp\\php\\php.exe` 為安裝 XAMPP 的 PHP 預設路徑 8.修改後存檔,完成設定 ### 使用方法 按下 `F1` ![](https://i.imgur.com/hQ02og8.png) 將 `PHP Intelephense` 設定為預設格式器 ![](https://i.imgur.com/qrFos3k.png) 設定完預設格式後,只要在程式碼中按下 `右鍵` ![](https://i.imgur.com/g6AbB10.png) `格式化文件` 可以將整支程式自動排版 `格式化選取範圍` 可以將匡選的區塊自動排版