面向过程的代码生成“错误”,面向对象的代码生成“异常”。在面向过程中使用条件判断来处理错误,在面向对象中则使用try和catch语句来处理异常。在try块中,一旦有异常抛出,其后的代码都不会执行。反之,如果没有抛出异常,catch块中的代码永远不执行。
接下来以向文件写入数据作示例:
class WriteToFile {
private $_fp = NULL;
function __construct($file) {
if (!file_exists($file) || !is_file($file)) {
throw new Exception('文件不存在!');
}
if (!$this->_fp = @fopen($file, 'w')) {
throw new Exception('无法以‘写’方式打开文件!');
}
}
function write($data) {
if (@!fwrite($this->_fp, $data."\n")) {
throw new Exception('无法写入文件');
}
}
function close() {
if ($this->_fp) {
fclose($this->_fp);
$this->_fp = NULL;
}
}
function __destruct() {
self::close();
echo '析构函数被调用';
}
}
类WriteToFile的构造函数首先检查文件是否存在且可写,然后以写方式打开文件。
使用这个类(先在创建data.txt文件夹,否则抛出异常:文件不存在):
try {
$fp = new WriteToFile('data.txt');
$fp->write('写入1行数据');
}
catch (Exception $e) {
echo 'Catch到异常:'.$e->getMessage();
}
查看新建的data.txt文件:
注:Exception类的构造函数可以有0到2个参数。第一个参数是错误信息,第二个参数是错误码。