Slide 1

Slide 1 text

Maintainable PHP Source Code Bo-Yi Wu 吳柏毅 2012.07.21 http://blog.wu-boy.com/

Slide 2

Slide 2 text

維護 PHP 專案程式碼 為什麼大家需要關心呢 ?

Slide 3

Slide 3 text

因為 我們每天花了很多時間在維護程式碼

Slide 4

Slide 4 text

維護 PHP 專案程式碼 誰最關心呢 ?

Slide 5

Slide 5 text

公司員工 : 趕快把程式碼寫完來去看電影 公司老闆 : 請給我一個可以擴充性的架構

Slide 6

Slide 6 text

員工 A: 奇怪這是誰寫的 Code 這麼亂 員工 B: 員工 A 寫的架構好像怪怪的 ?

Slide 7

Slide 7 text

為什麼大家會有這些想法呢?

Slide 8

Slide 8 text

那是因為沒有共同制定的 Coding Style

Slide 9

Slide 9 text

沒有好的 Coding Style 對於一個專案主管是非常痛苦

Slide 10

Slide 10 text

那什麼是易於維護的程式碼 Maintainable Code

Slide 11

Slide 11 text

四項必定要求  非常直覺  容易了解  可擴充性  容易 Debug

Slide 12

Slide 12 text

進入今日主題 Code Style Guide 程式設計師互相溝通的語言

Slide 13

Slide 13 text

各式各樣的編輯器 Tabs vs 4 Spaces

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

使用 Space 易於閱讀 Diff 程式碼

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

所以請將編輯器設定為 (Replaces tabs by spaces) 4 Spaces 取代 Tabs

Slide 20

Slide 20 text

程式碼結尾請勿有 多餘的空白

Slide 21

Slide 21 text

正規取代驗證多餘空白 ^(.*[^\s])?\s+$

Slide 22

Slide 22 text

^(.*[^\s])?\s+$ 開頭 結尾

Slide 23

Slide 23 text

^(.*[^\s])?\s+$ 代表 $1 結尾符號

Slide 24

Slide 24 text

^(.*[^\s])?\s+$ 結尾無空白

Slide 25

Slide 25 text

^(.*[^\s])?\s+$ $1 可有可無

Slide 26

Slide 26 text

^(.*[^\s])?\s+$ 結尾為空白

Slide 27

Slide 27 text

Geany Editor

Slide 28

Slide 28 text

檔案命名

Slide 29

Slide 29 text

請一律以小寫命名

Slide 30

Slide 30 text

檔案內容宣告

Slide 31

Slide 31 text

只使用

Slide 32

Slide 32 text

PHP5.4 以後 取消 short_open_tag 直接使用 = 標籤

Slide 33

Slide 33 text

檔案結尾請忽略 ?> 標籤

Slide 34

Slide 34 text

檔案格式

Slide 35

Slide 35 text

use only UTF-8 without BOM for PHP code 避免資料庫連線字元問題

Slide 36

Slide 36 text

如何寫程式註解 註解上面必須空一行

Slide 37

Slide 37 text

No content

Slide 38

Slide 38 text

No content

Slide 39

Slide 39 text

如何寫函式註解 註解上面必須空一行

Slide 40

Slide 40 text

No content

Slide 41

Slide 41 text

變數命名

Slide 42

Slide 42 text

請使用 小寫英文字母或底線

Slide 43

Slide 43 text

No content

Slide 44

Slide 44 text

No content

Slide 45

Slide 45 text

常數命名

Slide 46

Slide 46 text

請使用 大寫英文字母或底線 ( 定義在同一檔案內 )

Slide 47

Slide 47 text

No content

Slide 48

Slide 48 text

PHP Keywords

Slide 49

Slide 49 text

true, false, null array, integer, string

Slide 50

Slide 50 text

請一律用小寫

Slide 51

Slide 51 text

No content

Slide 52

Slide 52 text

條件判斷式 (Control Structures)

Slide 53

Slide 53 text

if, for, foreach, while, switch

Slide 54

Slide 54 text

if, for, foreach, while, switch

Slide 55

Slide 55 text

if ($arg === true) { //do something here } elseif ($arg === null) { //do something else here } else { //catch all do something here }

Slide 56

Slide 56 text

單行條件式過長

Slide 57

Slide 57 text

if (($a == $b) and ($b == $c) or ($a == $e) ) { $a = $d; }

Slide 58

Slide 58 text

if($arg === true) { //do something here } elseif($arg === null) { //do something else here } else { //catch all do something here } 條件式 if 括號旁邊請留一個空白

Slide 59

Slide 59 text

If, for, foreach, while, switch

Slide 60

Slide 60 text

Slide 61

Slide 61 text

Slide 62

Slide 62 text

If, for, foreach, while, switch

Slide 63

Slide 63 text

$value) { // foreach body }

Slide 64

Slide 64 text

If, for, foreach, while, switch

Slide 65

Slide 65 text

Slide 66

Slide 66 text

If, for, foreach, while, switch

Slide 67

Slide 67 text

switch ($var) { 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; }

Slide 68

Slide 68 text

判斷式內容請勿寫在同一行

Slide 69

Slide 69 text

No content

Slide 70

Slide 70 text

No content

Slide 71

Slide 71 text

替代 if 方案

Slide 72

Slide 72 text

取代 if (isset($var)) { $var = 'test'; }

Slide 73

Slide 73 text

isset($var) and $var = 'test';

Slide 74

Slide 74 text

if (isset($variable)) { $variable = 'test1'; } else { $variable = 'test2'; } 不建議此寫法

Slide 75

Slide 75 text

$var = isset($var) ? 'test1' : 'test2'; $var = isset($var) ?: 'default';

Slide 76

Slide 76 text

邏輯符號表式

Slide 77

Slide 77 text

請用 and or 取代 && || 讓程式更容易閱讀

Slide 78

Slide 78 text

此用法僅限於 === 或 !== 或 function 回傳值

Slide 79

Slide 79 text

運算元計算 請使用 && 或 ||

Slide 80

Slide 80 text

邏輯符號左右兩邊 請留一個空白

Slide 81

Slide 81 text

if ($var == false and $other_var != 'some_value') if ($var === false or my_function() !== false) if ( ! $var)

Slide 82

Slide 82 text

PHP 物件表示

Slide 83

Slide 83 text

/** * Documentation Block Here */ class Session { // all contents of class // must be indented four spaces public function test() {} }

Slide 84

Slide 84 text

/** * Documentation Block Here */ class Session { /** * Documentation Block Here */ public function get_flash($name, $data) { $closure = function($a, $b) { // Your closure code here } } }

Slide 85

Slide 85 text

物件內部變數或函式 務必定義 private,protected,public

Slide 86

Slide 86 text

/** * Documentation Block Here */ class Session { var $test = null; /** * Documentation Block Here */ function get_flash($name, $data) { // Your code here } } 請勿使用 var 定義變數

Slide 87

Slide 87 text

單引號或雙引號 ?

Slide 88

Slide 88 text

用單引號更勝於雙引號 ( 只是為了統一 Code Style)

Slide 89

Slide 89 text

別再相信 單引號效能大於雙引號

Slide 90

Slide 90 text

有興趣請看效能評估 http://nikic.github.com/2012/01/09/Disproving-the- Single-Quotes-Performance-Myth.html

Slide 91

Slide 91 text

字串連接 Concatenation

Slide 92

Slide 92 text

$string = 'my string '.$var.' the rest of my string'; 變數旁邊請留空白

Slide 93

Slide 93 text

$string = 'my string ' . $var . ' the rest of my string';

Slide 94

Slide 94 text

字串如果過長呢 ? 例如 SQL 語法

Slide 95

Slide 95 text

$sql = "SELECT `id`, `name` FROM `people` " . "WHERE `name` = 'Susan' " . "ORDER BY `name` ASC ";

Slide 96

Slide 96 text

今天就講到這裡 大家有什麼問題

Slide 97

Slide 97 text

 PHP Framework Interop Group  PSR­0  PSR­1  PSR­2  Zend Framework Coding Standard for PHP 參考資料

Slide 98

Slide 98 text

謝謝