Chinaunix首页 | 论坛 | 博客
  • 博客访问: 19003410
  • 博文数量: 7460
  • 博客积分: 10434
  • 博客等级: 上将
  • 技术积分: 78178
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 22:54
文章分类

全部博文(7460)

文章存档

2011年(1)

2009年(669)

2008年(6790)

分类:

2008-05-17 10:50:49

已经玩php一段时间了,基本是from0开始的,经常出现的问题也很多,慢慢的可以熟练的查询文档了,而且,经验也不是很多。

  先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就是这么做的.

阅读(326) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~