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