1、異常的基本使用
用戶可以用自定義的異常處理類來擴展 PHP 內置的異常處理類。
以下的代碼說明了在內置的異常處理類中,哪些屬性和方法在子類中是可訪問和可繼承的。
譯者注:以下這段代碼只爲說明內置異常處理類的結構,它並不是一段有實際意義的可用代碼。
當異常被拋出時,其後的代碼不會繼續執行,PHP 會嘗試查找匹配的 “catch” 代碼塊。
<?php
class Exception
{
protected $message = 'Unknown exception'; // 異常信息
protected $code = 0; // 用戶自定義異常代碼
protected $file; // 發生異常的文件名
protected $line; // 發生異常的代碼行號
function __construct($message = null, $code = 0);
final function getMessage(); // 返回異常信息
final function getCode(); // 返回異常代碼
final function getFile(); // 返回發生異常的文件名
final function getLine(); // 返回發生異常的代碼行號
final function getTrace(); // backtrace() 數組
final function getTraceAsString(); // 已格成化成字符串的 getTrace() 信息
/* 可重載的方法 */
function __toString(); // 可輸出的字符串
}
?>
如果異常沒有被捕獲,而且又沒用使用
set_exception_handler() 作相應的處理的話,
那麼將發生一個嚴重的錯誤(致命錯誤),並且輸出 “Uncaught Exception” (未捕獲異常)的錯誤消息。
如果使用自定義的類來擴展內置異常處理類,並且要重新定義構造函數的話,
建議同時調用 parent::__construct() 來檢查所有的變量是否已被賦值。
當對象要輸出字符串的時候,可以重載 __toString() 並自定義輸出的樣式。
列如:
<?php
//create function with an exception
function checkNum($number)
{
if($number>1)
{
throw new Exception("Value must be 1 or below");
}
return true;
}
//trigger exception
checkNum(2);
?>
Try,和 throw ,catch
Try - 使用異常的函數應該位於 “try” 代碼塊內。如果沒有觸發異常,則代碼將照常繼續執行。但是如果異常被觸發,會拋出一個異常。
Throw - 這裏規定如何觸發異常。每一個 “throw” 必須對應至少一個 “catch”
Catch - “catch” 代碼塊會捕獲異常,並創建一個包含異常信息的對象
異常寫法
<?php
try{
if( !is_numeric($three) || !is_numeric($four) )
{
throw new MyException('兩個值一定是數值型數據');
}
}catch( MyException $e ){
}
?>
2、異常的規則
需要進行異常處理的代碼應該放入 try 代碼塊內,以便捕獲潛在的異常。
每個 try 或 throw 代碼塊必須至少擁有一個對應的 catch 代碼塊。
使用多個 catch 代碼塊可以捕獲不同種類的異常。
可以在 try 代碼塊內的 catch 代碼塊中再次拋出(re-thrown)異常
總之,頁面出現異常我們就要捕獲它們。
Static(靜態)關鍵字
聲明類屬性或方法爲靜態,就可以不實例化類而直接訪問。靜態屬性不能通過一個類已實例化的對象來訪問(但靜態方法可以)。
由於靜態方法不需要通過對象即可調用,所以僞變量 $this 在靜態方法中不可用。
靜態屬性不可以由對象通過 -> 操作符來訪問。
用靜態方式調用一個非靜態方法會導致一個 E_STRICT 級別的錯誤。
就像其它所有的 PHP 靜態變量一樣,靜態屬性只能被初始化爲文字或常量,不能使用表達式。所以可以把靜態屬性初始化爲整數或數組,但不能初始化爲另一個變量或函數返回值,也不能指向一個對象。
1、異常處理
異常處理(又稱爲錯誤處理)功能提供了處理程序運行時出現的錯誤或異
常情況的方法。
2、後期靜態綁定
自 PHP 5.3.0 起,PHP >增加了一個叫做後期靜態綁定的功能,用於在繼承範圍內引用靜態調用的類。
後期靜態綁定本想通過引入一個新的關鍵字表示運行時最初調用的類來繞過限制。簡單地說,這個關鍵字能夠讓你在上述例子中調用 test() 時引用的類是 B 而不是 A。最終決定不引入新的關鍵字,而是使用已經預留的 static 關鍵字。
代碼如下:
“`