分类:
2008-05-17 10:50:49
先lookhere。:
error_reporting(1048);//1,2,4,7,...,1048
ob_start();
session_start();
date_default_timezone_set('Asia/Shanghai');
php的递给调用会吃掉很多的内存。
一般的,不要太多的使用define。
在类的构造和属性器方面,5已经做了很多的,克服的bug就不说了,__系列的函数都有一些看点,也是支持static的。
按照我现在的写过的程序,很少用到页面的,我感觉在php里面速度不在是一个问题。
注意类的调用次序,特别是已经extends的,准确的释放掉内存。
@mysql_fetch_array($result,MYSQL_ASSOC);
这个注意使用乱用,MYSQL_ASSOC,MYSQL_NUM和MYSQL_BOTH是一个enum吧。默认的是MYSQL_BOTH.
的语句,如果执行in的话不再支持limit。so...很麻烦。
支持distinct,group之,程序循环执行,md。
if(get_magic_quotes_gpc()){
$_GET= stripslashes_gpc($_GET);
$_POST= stripslashes_gpc($_POST);
$_COOKIE= stripslashes_gpc($_COOKIE);
}
set_magic_quotes_runtime(0);#magic_quotes_runtime
functionstripslashes_gpc($array){
while(list($key,$value)=each($array)){
if(is_string($value)){
$array[$key]=addslashes(stripslashes($value));
}elseif(is_array($value)) {
$array[$key]=stripslashes_gpc($value);
}
}
return$array;
}
/**
*处理程序中出现的错误
*@Date:2006-10-9-10:51
*@param (类型) (参数名) (描述)
*/
functionError_Handler($errno,$errstr,$errorfile,$errline,$errtext){
?cho('系统发生错误:'.$errstr);
echo('At'.$errorfile.'的第'.$errline.'行.');
if($errno==E_USER_ERROR){
echo('致命错误,程序已经中止');
}
}
在使用的时候:
set_error_handler('Error_Handler');
trigger_error('calltrigger_error',E_USER_ERROR);
这是使用函数获取的,当然您的错误报告级别应该高点:
error_reporting(1048);
为了更加oo,先看看一个描述类的自写的函数:
$classname='Exception';
/**
*(功能描述)
*@Date:
*@param (类型) (参数名) (描述)
*/
functionClassDetail($classname){
if(!class_exists($classname)){
echo($classname.'类不存在');
}else{
print_r("以下描述类".$classname);
print_r("所有的方法");
print_r(get_class_methods($classname));
print_r("
");
print_r("
所有的属性");
print_r(get_class_vars($classname));
print_r("
");
}
}
ClassDetail($classname);
发现exception类的所有get方法是:
[0]=>__construct
[1]=>getMessage
[2]=>getCode
[3]=>getFile
[4]=>getLine
[5]=>getTrace
[6]=>getTraceAsString
[7]=>__toString
慢慢的优化个性点,也可以的。
ok,来看比较oo的处理方式:
classErrorHandlersextendsException{
private$_context=null;
function __construct($level, $string, $file, $line, $context=null){
parent::__construct($string,$level);
$this->file = $file;
$this->line = $line;
$this->_level = $level;
$this->_context = $context;
}
function__destruct(){
// parent::__destruct();
}
functionMessage(){
$errors=array(
E_ERROR =>'error',
E_WARNING =>'warning',
E_PARSE =>'parsingerror',
E_NOTICE =>'notice',
E_CORE_ERROR =>'coreerror',
E_CORE_WARNING =>'corewarning',
E_COMPILE_ERROR =>'compileerror',
E_COMPILE_WARNING=>'compilewarning',
E_USER_ERROR =>'usererror',
E_USER_WARNING =>'userwarning',
E_USER_NOTICE =>'usernotice'
);
$str=$errors[parent::getCode()].':'.parent::getMessage().'在'.parent::getFile().
'的第'.parent::getLine()."行
";
if($this->_level==E_USER_ERROR){
$str.=('
致命错误');
}
echo('');
echo($str);
echo('
');
}
}
functionerror_handler($errno,$errstr,$errorfile,$errline,$errtext){
thrownewErrorHandlers($errno,$errstr,$errorfile,$errline,$errtext);
}
functionexception_handler(Exception$e)
{
$errors=array(
E_ERROR =>'error',
E_WARNING =>'warning',
E_PARSE =>'parsingerror',
E_NOTICE =>'notice',
E_CORE_ERROR =>'coreerror',
E_CORE_WARNING =>'corewarning',
E_COMPILE_ERROR =>'compileerror',
E_COMPILE_WARNING=>'compilewarning',
E_USER_ERROR =>'usererror',
E_USER_WARNING =>'userwarning',
E_USER_NOTICE =>'usernotice');
echo$errors[$e->getCode()].':'.$e->getMessage().'in'.$e->getFile().
'online'.$e->getLine()."
";
echo$e->getTraceAsString();
}
trigger_error('5do8');
try{
$i =1/0;
}catch(ErrorHandlers $e) {
echo "发生错误.";//可以输出错误行
$e->Message();
}
而后,注意了,如果您第一次(或者重新)加载的话,就加上:
set_error_handler('error_handler');
set_exception_handler('exception_handler');
如果不是上述情况,就不要加了,否则会出现
ExceptionthrownwithoutastackframeinUnknownonline0
因为error_handler是anto_flush的。
在一个exception里面不艿饔?a href="javascript:;" onClick="javascript:tagshow(event, '%C6%E4%CB%FB');" target="_self">其他的exception。有2条普遍适用的规则,如下:
1:不要在一个Exception里面执行另一个Exception
2:不要在析构函数里面执行Exception.
restore_exception_handler();是可以保存exception柄的,注意,执行error以后就会有Exception的了。
最后,加上一个完整的例子:CallError.php
error_reporting(1048);
classErrorHandlersextendsException{
private$_context=null;
function __construct($level, $string, $file, $line, $context=null){
parent::__construct($string,$level);
$this->file = $file;
$this->line = $line;
$this->_level = $level;
$this->_context = $context;
}
function__destruct(){
// parent::__destruct();
}
functionMessage(){
$errors=array(
E_ERROR =>'error',
E_WARNING =>'warning',
E_PARSE =>'parsingerror',
E_NOTICE =>'notice',
E_CORE_ERROR =>'coreerror',
E_CORE_WARNING =>'corewarning',
E_COMPILE_ERROR =>'compileerror',
E_COMPILE_WARNING=>'compilewarning',
E_USER_ERROR =>'usererror',
E_USER_WARNING =>'userwarning',
E_USER_NOTICE =>'usernotice'
);
$str=$errors[parent::getCode()].':'.parent::getMessage().'在'.parent::getFile().
'的第'.parent::getLine()."行
";
if($this->_level==E_USER_ERROR){
$str.=('
致命错误');
}
echo('');
echo($str);
echo('
');
}
}
functionerror_handler($errno,$errstr,$errorfile,$errline,$errtext){
thrownewErrorHandlers($errno,$errstr,$errorfile,$errline,$errtext);
}
functionexception_handler(Exception$e)
{
$errors=array(
E_ERROR =>'error',
E_WARNING =>'warning',
E_PARSE =>'parsingerror',
E_NOTICE =>'notice',
E_CORE_ERROR =>'coreerror',
E_CORE_WARNING =>'corewarning',
E_COMPILE_ERROR =>'compileerror',
E_COMPILE_WARNING=>'compilewarning',
E_USER_ERROR =>'usererror',
E_USER_WARNING =>'userwarning',
E_USER_NOTICE =>'usernotice');
echo$errors[$e->getCode()].':'.$e->getMessage().'在'.$e->getFile().
'的第'.$e->getLine()."行
";
echo$e->getMessage();
die();
}
//
set_error_handler('error_handler');
//restore_error_handler();
set_exception_handler('exception_handler');
//restore_exception_handler();
我肯定是错误
?>
执行结果:
notice:Useofundefinedconstant我肯定是错误-assumed'我肯定是错误'在E:webwebphpiexceptionm.php的第74行Useofundefinedconstant我肯定是错误-assumed'我肯定是错误'
另外,在类中,还可以这样:
functiontrigger_error($error_msg,$error_type=E_USER_WARNING)
{
trigger_error("error:$error_msg",$error_type);
}
著名的Smarty就是这么做的.