PHP Exceptions 種類與使用情境說明

Written by Simon Asika on

file

更新為 PHP 7 以後的版本

PHP 的 Exceptions 提供我們一個方便的方法處理錯誤,不過許多人並不是完全知道每一種不同的Exception代表什麼意思,以及如何使用。有鑑於中文資料實在太少了,我在這邊做一點講解,讓大家可以更流暢的使用不同的 Exception 物件。

在看這篇文章之前,妳可能需要先具備基礎的 Exception 與 try catch 知識。

  • http://blog.xuite.net/ghostjackyo/WorkTest/37743727-PHP+Try+Catch
  • http://jaceju.net/2010-04-23-handle-php-error-and-exception/
  • http://www.w3school.com.cn/php/php_exception.asp

寫出健壯的 PHP 應用程式(1): 防禦型程式寫法

Written by Simon Asika on

這幾年無論在帶團隊寫系統,還是自己開發 Opensource,感觸最深的其實是軟體健壯性這一塊。該怎麼描述軟體的健壯性呢,用 國家教育研究所 的定義來看吧,健壯性指的是:

軟體本身的周密程度。即撰寫程式時考慮到各種不同的使用情況,並事先加以定義處理,避免使用時產生錯誤。

關於健壯性

健壯性是一個很廣泛的討論主題,我想我也沒有能力描述的很完全,這裡以我自己本身常遇到的狀況來介紹一些概念,作為拋磚引玉。開發的時候顧及這些概念,可以讓系統出現未預期錯誤的機會降到最低。

這裡的錯誤不單純指系統 Error,甚至包含邏輯處理的錯誤(例如時間算錯、金錢算錯等等),都應該是開發過程中要極力避免的。但很可惜,在永遠不足夠的開發時間與無止盡的新需求下,我們很難有機會完整測試自己或團隊成員所寫的每一行 code 正不正確。此時正確的觀念可以幫助我們避開很多陷阱。


用 SplObjectStorage 來避免無窮迴圈

Written by Simon Asika on

SplObjectStorage 是一個方便我們儲存物件,並確認是否曾經儲存過的工具,無須煩惱物件的名稱。例如:

$storage = new SplObjectStorage;

$o1 = new StdClass;
$o2 = new StdClass;
$o3 = new StdClass;

$s->attach($o1);
$s->attach($o2);

var_dump($s->contains($o1));
var_dump($s->contains($o2));
var_dump($s->contains($o3));

結果會是:

bool(true)
bool(true)
bool(false)

PowerShell 執行 ps1 檔時出現「系統上已停用指令碼執行」錯誤

Written by Simon Asika on

當我們使用 PowerShell 執行自定 script 檔,卻出現「檔案無法載入,因為這個系統已停用指令碼執行」的訊息,表示在目前作業系統中的執行原則 ( Excution Policy ) 預設狀態為 Restricted,也就是不允許執行。

可透過一些指令進行執行原則變更,首先請用管理員權限打開 PowerShell,執行以下指令:

$ Set-ExecutionPolicy RemoteSigned

讓系統接受所有自訂或是信任來源的腳本檔案,這樣 ps1 檔就能帳常執行啦。


讓 PHPStorm IDE 自動使用 CodeSniffer 驗證程式碼

Written by Simon Asika on

p-2013-12-21-10.jpg

PHP_CodeSniffer 是很優秀的程式碼品質驗證工具,不只被用在團隊開發時維護編程標準,Open source 也廣泛使用這項工具來控管貢獻程式的品質。如果我們能夠在實際編輯程式的過程就依靠 CodeSniffer 幫助驗證則更有效率,PHPStorm 就是一套能夠在編輯過程直接整合 CodeSniffer 的工具。

安裝 CodeSniffer

先參考 在 Windows 安裝 PHP PEAR 這篇文章,將 PEAR 安裝起來,接著透過 PEAR 安裝 PHP_CodeSniffer:

$ pear install PHP_CodeSniffer

在 Windows 安裝 PHP PEAR

Written by Simon Asika on

pear.png

因為最近轉移工作環境到 AMPPS ,預設並沒有像 XAMPP 一樣安裝 PEAR,所以決定自行安裝起來使用。

設定環境變數

首先得讓 CMD 可以執行 php 指令,參考 設定環境變數讓 Windows cmd 命令列可以執行 php 指令 這篇文章,先加入 AMPPS 的 php 路徑。(其他伺服器包也是同樣的設定)

我為了管理方便,想把 pear 裝在 C:\bin\pear 下面,所以環境變數記得加上這個位置,然後重開機。


安裝 Ubuntu Server 的一些初始網路設定

Written by Simon Asika on

平時太習慣 VPS 設定好的環境,剛安裝完單機版 Ununtu 之後就是連不上網路,不過內網連的好好的。希望將主機當成伺服器的使用者需要記得先做幾項設定,讓網路暢通。

設定靜態 IP

輸入以下指令編輯網路設定:

$ sudo vim /etc/network/interface

改成如下設定


讓 Windows 的 CMD 可以顯示 ANSI 顏色

Written by Simon Asika on

p2013-11-04-5.jpg

Windows 的命令列無論是傳統 CMD 還是新的 PowerShell 都是黑白的世界,就像熊貓只能拍黑白照片一樣。不過我們可以裝點小東西,讓 Windows 也能擁有七彩繽紛的命令列。


PHP Slim 教學 - 用 Slim 整合 Twig 打造 Prototype 系統

Written by Simon Asika on

img

一直以來都在用 HTML + Bootstrap 來做 Prototype , 之前是自己用 Native PHP 寫了簡易的 Routing 與 Helper Proxy,直接用檔案結構當作網址階層,作為一個靜態頁面又能簡單支持PHP的系統來說很足夠了,也就這樣用了很久。

單純覺得想玩點新玩具,所以研究了一下有沒有合用的 Micro Framework,Silex 稍嫌厚重了點,所以就選了 Slim 來用。


實作 PHP Daemon 接收 Unix Signal 訊號

Written by Simon Asika on

Signal.png

一個 Daemon 守護進程除了存在記憶體中默默執行工作之外,也需要能夠接收訊號來處理事情,並且能夠寫入一些 Log 訊息讓使用者查詢。

前幾天寫了 用 PHP Daemon 創建 HTTP Server,但範例中的 Daemon 其實不夠完整,我們這次額外來實作讓 Daemon 可以接收 Unix 的訊號(Signal),來處理事情吧。


Control Tools

WS-logo