Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Matainable PHP Source Code
Search
Bo-Yi Wu
July 25, 2012
Technology
2
1.1k
Matainable PHP Source Code
How to write matainable PHP Source Code
Bo-Yi Wu
July 25, 2012
Tweet
Share
More Decks by Bo-Yi Wu
See All by Bo-Yi Wu
Building a Unified API Gateway for Secure and Scalable Cross-Cloud AI Service
appleboy
0
7
Building MCP (Model Context Protocol) with Golang
appleboy
0
370
如何設計一套具備 Container 容器化技術的 CI/CD 平台?
appleboy
0
1.5k
生成式 AI CodeGPT 開發經驗談
appleboy
0
3k
打造 MLOps 平台 改善 AI 模型開發流程
appleboy
0
2.2k
自動化監控伺服器工具 - Gatus
appleboy
0
4k
Drone CI/CD 自動化測試及部署
appleboy
1
510
初探 Infrastructure as Code 工具 Pulumi
appleboy
2
3.6k
Introduction to Open Policy Agent
appleboy
0
2k
Other Decks in Technology
See All in Technology
さくらのIaaS基盤のモニタリングとOpenTelemetry/OSC Hokkaido 2025
fujiwara3
3
460
Delta airlines Customer®️ USA Contact Numbers: Complete 2025 Support Guide
deltahelp
0
810
NewSQLや分散データベースを支えるRaftの仕組み - 仕組みを理解して知る得意不得意
hacomono
PRO
3
180
データ基盤からデータベースまで?広がるユースケースのDatabricksについて教えるよ!
akuwano
3
130
american aa airlines®️ USA Contact Numbers: Complete 2025 Support Guide
aaguide
0
310
VS CodeとGitHub Copilotで爆速開発!アップデートの波に乗るおさらい会 / Rapid Development with VS Code and GitHub Copilot: Catch the Latest Wave
yamachu
2
150
Delegating the chores of authenticating users to Keycloak
ahus1
0
160
ビジネス職が分析も担う事業部制組織でのデータ活用の仕組みづくり / Enabling Data Analytics in Business-Led Divisional Organizations
zaimy
0
130
AI エージェントと考え直すデータ基盤
na0
11
3.2k
IPA&AWSダブル全冠が明かす、人生を変えた勉強法のすべて
iwamot
PRO
2
170
freeeのアクセシビリティの現在地 / freee's Current Position on Accessibility
ymrl
2
230
LangChain Interrupt & LangChain Ambassadors meetingレポート
os1ma
2
320
Featured
See All Featured
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
How STYLIGHT went responsive
nonsquared
100
5.6k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
48
2.9k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
107
19k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
181
54k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
A Modern Web Designer's Workflow
chriscoyier
695
190k
How to train your dragon (web standard)
notwaldorf
96
6.1k
YesSQL, Process and Tooling at Scale
rocio
173
14k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
740
Transcript
Maintainable PHP Source Code Bo-Yi Wu 吳柏毅 2012.07.21 http://blog.wu-boy.com/
維護 PHP 專案程式碼 為什麼大家需要關心呢 ?
因為 我們每天花了很多時間在維護程式碼
維護 PHP 專案程式碼 誰最關心呢 ?
公司員工 : 趕快把程式碼寫完來去看電影 公司老闆 : 請給我一個可以擴充性的架構
員工 A: 奇怪這是誰寫的 Code 這麼亂 員工 B: 員工 A 寫的架構好像怪怪的
?
為什麼大家會有這些想法呢?
那是因為沒有共同制定的 Coding Style
沒有好的 Coding Style 對於一個專案主管是非常痛苦
那什麼是易於維護的程式碼 Maintainable Code
四項必定要求 非常直覺 容易了解 可擴充性 容易 Debug
進入今日主題 Code Style Guide 程式設計師互相溝通的語言
各式各樣的編輯器 Tabs vs 4 Spaces
None
None
使用 Space 易於閱讀 Diff 程式碼
None
None
所以請將編輯器設定為 (Replaces tabs by spaces) 4 Spaces 取代 Tabs
程式碼結尾請勿有 多餘的空白
正規取代驗證多餘空白 ^(.*[^\s])?\s+$
^(.*[^\s])?\s+$ 開頭 結尾
^(.*[^\s])?\s+$ 代表 $1 結尾符號
^(.*[^\s])?\s+$ 結尾無空白
^(.*[^\s])?\s+$ $1 可有可無
^(.*[^\s])?\s+$ 結尾為空白
Geany Editor
檔案命名
請一律以小寫命名
檔案內容宣告
只使用 <?php 或 <?= 標籤
PHP5.4 以後 取消 short_open_tag 直接使用 <?= 標籤
檔案結尾請忽略 ?> 標籤
檔案格式
use only UTF-8 without BOM for PHP code 避免資料庫連線字元問題
如何寫程式註解 註解上面必須空一行
None
None
如何寫函式註解 註解上面必須空一行
None
變數命名
請使用 小寫英文字母或底線
None
None
常數命名
請使用 大寫英文字母或底線 ( 定義在同一檔案內 )
None
PHP Keywords
true, false, null array, integer, string
請一律用小寫
None
條件判斷式 (Control Structures)
if, for, foreach, while, switch
if, for, foreach, while, switch
if ($arg === true) { //do something here } elseif
($arg === null) { //do something else here } else { //catch all do something here }
單行條件式過長
if (($a == $b) and ($b == $c) or ($a
== $e) ) { $a = $d; }
if($arg === true) { //do something here } elseif($arg ===
null) { //do something else here } else { //catch all do something here } 條件式 if 括號旁邊請留一個空白
If, for, foreach, while, switch
<?php for ($i = 0; $i < $max; $i++) {
//loop here }
<?php for ($i=0; $i<$max; $i++) { //loop here } 邏輯符號
=,< 左右兩邊請留一個空白
If, for, foreach, while, switch
<?php foreach ($iterable as $key => $value) { // foreach
body }
If, for, foreach, while, switch
<?php while ($expr) { // structure body } <?php do
{ // structure body; } while ($expr);
If, for, foreach, while, switch
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; }
判斷式內容請勿寫在同一行
None
None
替代 if 方案
取代 if (isset($var)) { $var = 'test'; }
isset($var) and $var = 'test';
if (isset($variable)) { $variable = 'test1'; } else { $variable
= 'test2'; } 不建議此寫法
$var = isset($var) ? 'test1' : 'test2'; $var = isset($var)
?: 'default';
邏輯符號表式
請用 and or 取代 && || 讓程式更容易閱讀
此用法僅限於 === 或 !== 或 function 回傳值
運算元計算 請使用 && 或 ||
邏輯符號左右兩邊 請留一個空白
if ($var == false and $other_var != 'some_value') if ($var
=== false or my_function() !== false) if ( ! $var)
PHP 物件表示
/** * Documentation Block Here */ class Session { //
all contents of class // must be indented four spaces public function test() {} }
/** * Documentation Block Here */ class Session { /**
* Documentation Block Here */ public function get_flash($name, $data) { $closure = function($a, $b) { // Your closure code here } } }
物件內部變數或函式 務必定義 private,protected,public
/** * Documentation Block Here */ class Session { var
$test = null; /** * Documentation Block Here */ function get_flash($name, $data) { // Your code here } } 請勿使用 var 定義變數
單引號或雙引號 ?
用單引號更勝於雙引號 ( 只是為了統一 Code Style)
別再相信 單引號效能大於雙引號
有興趣請看效能評估 http://nikic.github.com/2012/01/09/Disproving-the- Single-Quotes-Performance-Myth.html
字串連接 Concatenation
$string = 'my string '.$var.' the rest of my string';
變數旁邊請留空白
$string = 'my string ' . $var . ' the
rest of my string';
字串如果過長呢 ? 例如 SQL 語法
$sql = "SELECT `id`, `name` FROM `people` " . "WHERE
`name` = 'Susan' " . "ORDER BY `name` ASC ";
今天就講到這裡 大家有什麼問題
PHP Framework Interop Group PSR0 PSR1
PSR2 Zend Framework Coding Standard for PHP 參考資料
謝謝