PHP5的异常处理机制[2]--PHP5之前的错误处理之die()
2004-08-27 22:07
706 查看
PHP5之前的错误处理
在PHP5之前的程序错误处理多使用以下三种办法:
1.使用trigger_error()或die()函数来生成一个脚本层次的警告(warning)或致命错误(fatalerror);
2.在类方法或函数中返回一个错误标记(如false),也可能设置一个之后可以检查的属性或全局变量(如$error),然后在适合的地方检验其值再决定是否继续执行程序(如if($error==1){});
3.使用PEAR处理错误;
(一)使用die()或trigger_error()
你可以使用die()函数来结束程序运行。以下是一个简单的类,它尝试从一个目录中加载一个类文件。index.php
这是一个用PHP实现“CommandPattern设计模式”的简单例子(请参看《Java与模式》)。使用这个类的程序员(客户程序员clientcoder)可以将一个类放到目录中(例中为cmd_php4目录)。一旦文件和其中包含的类同名,并且这个类是Command类的子类,我们的类方法将生成一个可用的Command对象。Command类中定义了一个execute()方法用来执行找到的命令,即getCommandObject()方法返回的对象将执行execute().我们再看看父类Command类,我们将它存在cmd_php4/Command.php文件中。
cmd_php4/Command.php
你可以看到,Command是PHP4中抽象类的实现,我们无法直接将其实例化,而必须先从中派生中子类然后再实例化。当我们使用PHP5后,我们可以使用更好的方式—使用abstract关键字将类和方法声明为“抽象”:
下面是对上面的抽象类的实现,覆写了execute()方法,在其中加入真正可以执行的内容。这个类命名为realcommand,可以在cmd_php4/realcommand.php文件中找到。
cmd_php4/realcommand.php
使用这样的结构可以使代码变得很灵活。你可以在任何时候增加新的Command类,而不需要改变外围的框架。但是你不得不注意一些潜在的中止脚本执行的因素。我们需要确保类文件存在,并且在文件中该类存在,并且该类是Command的子类>(就像realcommand一样)。
在例子中,如果我们尝试寻找类的操作失败,脚本执行将会中止,这体现了代码的安全性。但这段代码不灵活,没有足够的弹性。极端的反映是类方法只能进行积极正面的操作,它只负责找出和实例化一个Command对象。它无法处理更大范围内脚本执行的错误(当然它也不应该负责处理错误,如果我们给某个类方法加上太多与周边代码的关联,那么这个类的重用将会变得困难,不易扩展)。尽管使用die()避免了在getCommandObject()方法中嵌入脚本逻辑的危险,它对于对于错误的反应显得过于激烈—-马上中止程序。事实上有时候我们并不希望在找不到想要的类文件时就马上停止执行程序,也许我们有一个默认的命令让程序继续执行。
在PHP5之前的程序错误处理多使用以下三种办法:
1.使用trigger_error()或die()函数来生成一个脚本层次的警告(warning)或致命错误(fatalerror);
2.在类方法或函数中返回一个错误标记(如false),也可能设置一个之后可以检查的属性或全局变量(如$error),然后在适合的地方检验其值再决定是否继续执行程序(如if($error==1){});
3.使用PEAR处理错误;
(一)使用die()或trigger_error()
你可以使用die()函数来结束程序运行。以下是一个简单的类,它尝试从一个目录中加载一个类文件。index.php
//PHP4
require_once(
'cmd_php4/Command.php'
);
class
CommandManager
{
var
$cmdDir
=
"cmd_php4"
;
function
getCommandObject
(
$cmd
){
$path
=
"{$this->cmdDir}/{$cmd}.php"
;
if(!
file_exists
(
$path
)){
die(
"Cannotfind$path/n"
);
}
require_once
$path
;
if(!
class_exists
(
$cmd
)){
die(
"class$cmddoesnotexist"
);
}
$ret
=new
$cmd
();
if(!
is_a
(
$ret
,
'Command'
)){
die(
"$cmdisnotaCommand"
);
}
return
$ret
;
}
}
?>
这是一个用PHP实现“CommandPattern设计模式”的简单例子(请参看《Java与模式》)。使用这个类的程序员(客户程序员clientcoder)可以将一个类放到目录中(例中为cmd_php4目录)。一旦文件和其中包含的类同名,并且这个类是Command类的子类,我们的类方法将生成一个可用的Command对象。Command类中定义了一个execute()方法用来执行找到的命令,即getCommandObject()方法返回的对象将执行execute().我们再看看父类Command类,我们将它存在cmd_php4/Command.php文件中。
cmd_php4/Command.php
//PHP4
class
Command
{
function
execute
(){
die(
"Command::execute()isanabstractmethod"
);
}
}
?>
你可以看到,Command是PHP4中抽象类的实现,我们无法直接将其实例化,而必须先从中派生中子类然后再实例化。当我们使用PHP5后,我们可以使用更好的方式—使用abstract关键字将类和方法声明为“抽象”:
//PHP5
abstractclass
Command
{
abstractfunction
execute
();
}
?>
下面是对上面的抽象类的实现,覆写了execute()方法,在其中加入真正可以执行的内容。这个类命名为realcommand,可以在cmd_php4/realcommand.php文件中找到。
cmd_php4/realcommand.php
//PHP4
require_once
'Command.php'
;
class
realcommand
extends
Command
{
function
execute
(){
"realcommand::execute()executingasorderedsah!/n"
;
}
}
?>
使用这样的结构可以使代码变得很灵活。你可以在任何时候增加新的Command类,而不需要改变外围的框架。但是你不得不注意一些潜在的中止脚本执行的因素。我们需要确保类文件存在,并且在文件中该类存在,并且该类是Command的子类>(就像realcommand一样)。
在例子中,如果我们尝试寻找类的操作失败,脚本执行将会中止,这体现了代码的安全性。但这段代码不灵活,没有足够的弹性。极端的反映是类方法只能进行积极正面的操作,它只负责找出和实例化一个Command对象。它无法处理更大范围内脚本执行的错误(当然它也不应该负责处理错误,如果我们给某个类方法加上太多与周边代码的关联,那么这个类的重用将会变得困难,不易扩展)。尽管使用die()避免了在getCommandObject()方法中嵌入脚本逻辑的危险,它对于对于错误的反应显得过于激烈—-马上中止程序。事实上有时候我们并不希望在找不到想要的类文件时就马上停止执行程序,也许我们有一个默认的命令让程序继续执行。
相关文章推荐
- PHP5的异常处理机制[1]--PHP5之前的错误处理之die()
- PHP5的异常处理机制[4]--PHP5之前的错误处理--返回Error flag(错误标记)
- PHP5的异常处理机制[3]--PHP5之前的错误处理之trigger_error()
- PHP5的异常处理机制[5]--PHP5之前的错误处理--使用PEAR处理错误
- PHP5的异常处理机制[2]--PHP5之前的错误处理之trigger_error()
- PHP5的异常处理机制[6]--PHP5之前的错误处理--小结
- PHP5的异常处理机制[3]--PHP5之前的错误处理--返回Error flag(错误标记)
- PHP5的异常处理机制[4]--PHP5之前的错误处理--使用PEAR处理错误
- PHP5的异常处理机制[5]--PHP5之前的错误处理--小结
- PHP5的异常处理机制[9]--同时处理多个错误
- PHP5的异常处理机制[10]--同时处理多个错误
- 异常处理—错误抛出机制
- 细说php的异常和错误处理机制
- PHP5的异常处理机制[12]--异常的传递、重掷异常
- PHP5的异常处理机制[13]--获得异常相关的更多信息
- php异常、错误处理机制
- PHP中的错误处理、异常处理机制
- PHP5的异常处理机制[1]--本文索引
- PHP5的异常处理机制[14]--总结 [END]
- php异常、错误处理机制