php(做為現在的主流開發語言)5之前的錯誤處理
在php(做為現在的主流開發語言)5之前的程序錯誤處理多使用以下三種辦法:
1.使用trigger_error()或die()函數來生成一個腳本層次的警告(warning)或致命錯誤(fatal error);
2.在類方法或函數中返回一個錯誤標記(如false),也可能設置一個之後可以檢查的屬性或全局變量(如$error),然後在適合的地方檢驗其值再決定是否繼續執行程序(如if($error==1){});
3.使用PEAR處理錯誤;
(一)使用die()或trigger_error()
你可以使用die()函數來結束程序運行。以下是一個簡單的類,它嘗試從一個目錄中加載一個類文件。
<? 代碼列表 index.php(做為現在的主流開發語言) ?>
<?php(做為現在的主流開發語言)
// php(做為現在的主流開發語言) 4
require_once(cmd_php(做為現在的主流開發語言)4/Command.php(做為現在的主流開發語言));
class CommandManager {
var $cmdDir = "cmd_php(做為現在的主流開發語言)4";
function getCommandObject($cmd) {
$path = "{$this->cmdDir}/{$cmd}.php(做為現在的主流開發語言)";
if (!file_exists($path)) {
die("Cannot find $path
");
}
require_once $path;
if (!class_exists($cmd)) {
die("class $cmd does not exist");
}
$ret = new $cmd();
if (!is_a($ret, Command)) {
die("$cmd is not a Command");
}
return $ret;
}
}
?>
這是一個用php(做為現在的主流開發語言)實現“Command Pattern設計模式”的簡單例子(請參看《Java與模式》)。使用這個類的程序員(客戶程序員client coder)可以將一個類放到目錄中(例中為cmd_php(做為現在的主流開發語言)4目錄)。一旦文件和其中包含的類同名,並且這個類是Command類的子類,我們的類方法將生成一個可用的Command對象。Command類中定義了一個 execute()方法用來執行找到的命令,即 getCommandObject()方法返回的對象將執行execute().
我們再看看父類Command類,我們將它存在cmd_php(做為現在的主流開發語言)4/Command.php(做為現在的主流開發語言)文件中。
<? 代碼列表cmd_php(做為現在的主流開發語言)4/Command.php(做為現在的主流開發語言) ?>
<?php(做為現在的主流開發語言)
// php(做為現在的主流開發語言) 4
class Command {
function execute() {
die("Command::execute() is an abstract method");
}
}
?>
你可以看到,Command是php(做為現在的主流開發語言)4中抽象類的實現,我們無法直接將其實例化,而必須先從中派生中子類然後再實例化。當我們使用php(做為現在的主流開發語言)5後,我們可以使用更好的方式—使用abstract關鍵字將類和方法聲明為“抽象”:
<? 代碼列表 ?>
<?php(做為現在的主流開發語言)
// php(做為現在的主流開發語言) 5
abstract class Command {
abstract function execute();
}
?>
下面是對上面的抽象類的實現,覆寫了execute()方法,在其中加入真正可以執行的內容。這個類命名為realcommand,可以在cmd_php(做為現在的主流開發語言)4/realcommand.php(做為現在的主流開發語言)文件中找到。
<? 代碼列表 cmd_php(做為現在的主流開發語言)4/realcommand.php(做為現在的主流開發語言) ?>
<?php(做為現在的主流開發語言)
// php(做為現在的主流開發語言) 4
require_once Command.php(做為現在的主流開發語言);
class realcommand extends Command {
function execute() {
print "realcommand::execute() executing as ordered sah!
";
}
}
?>
使用這樣的結構可以使代碼變得很靈活。你可以在任何時候增加新的Command類,而不需要改變外圍的框架。但是你不得不注意一些潛在的中止腳本執行的因素。我們需要確保類文件存在,並且在文件中該類存在,並且該類是Command的子類(就像realcommand一樣)。
在例子中,如果我們嘗試尋找類的操作失敗,腳本執行將會中止,這體現了代碼的安全性。但這段代碼不靈活,沒有足夠的彈性。極端的反映是類方法只能進行積極正面的操作,它只負責找出和實例化一個Command對象。它無法處理更大范圍內腳本執行的錯誤(當然它也不應該負責處理錯誤,如果我們給某個類方法加上太多與周邊代碼的關聯,那麼這個類的重用將會變得困難,不易擴展)。