1、关于PHP错误报告
当每次阅读manual时,都会有之前只会用而不知其原理的感觉,这次依旧如此。error_reporting、display_errors etc.
A 概念
int error_reporting(int $level),设置脚本在运行时报告何种级别的错误。display_error,设置是否在运行时将错误打印到屏幕。起初看到这里,其实脑子是迷糊的,一个是函数,一个是变量?于是,将“错误和日志记录配置选项”找出来,查看了17个选项的描述,然后使用function_exists测试了所有,其中,除了error_reporting、error_log为true外,其他均是false。那么问题就出现了,除了error_reporting、error_log可直接函数方式使用外都需要使用ini_set等进行运行时配置了?找到5.6等源码,在php-5.6.12/main/php_globals.h中,line72~79,列出了zend_bool型的变量8个,而80行点error_log是指针变量。在php-5.6.12/ext/standard/basic_functions.h中79行,找到了error_log的描述:PHP_FUNCTION(error_log); 在php-5.6.12/Zend/zend_builtin_functions.c 中行43找到了 static ZEND_FUNCTION(error_reporting);的描述。归结:error_log是基础函数,error_reporting是内置函数。其他的则是变量,通过ini_*使用。
B 应用
框架类:在三大环境dev、test、prod中,各类框架对以上函数和变量的处理都不一样,比如YII中,进行二次封装,这必然会带来性能的销耗,但却提升开发的便捷和总体框架的统一性。错误、警告、消息……记录入error_log指定文件中。
单文件:error_reporting(E_ALL);ini_set('display_errors', true);。
2、exit、die、return
首先,exit、die都是语言结构而非函数。
exit,中止当前脚本的执行,或者中止运行后输出一个消息/状态码。官方解释:尽管调用了 exit(), Shutdown函数 以及 object destructors 总是会被执行。
die,语法结构等同于exit。那为何还要制定这个die?使用如下的代码打印了结果,一样时303(php5.6中):
print_r(token_get_all("<?php die();exit();?>"));
结果:
Array ( [0] => Array ( [0] => 376 [1] => <?php [2] => 1 ) [1] => Array ( [0] => 303 [1] => die [2] => 1 ) [2] => ( [3] => ) [4] => ; [5] => Array ( [0] => 303 [1] => exit [2] => 1 ) [6] => ( [7] => ) [8] => ; [9] => Array ( [0] => 378 [1] => ?> [2] => 1 ) )
然后,翻看了源代码,在/Users/zhongchunji/Downloads/php-5.6.12/Zend/zend_language_parser.c中有 #define T_EXIT 303,查询T_DIE,不存在。在相同目录下多zend_language_scanner.c和zend_language_scanner.l中,有如下代码:
// *.c中 #line 1014 "Zend/zend_language_scanner.l" { return T_EXIT; } #line 1018 "Zend/zend_language_scanner.l" { return T_EXIT; } // *.l #1014 <ST_IN_SCRIPTING>"exit" { return T_EXIT; } #1018 <ST_IN_SCRIPTING>"die" { return T_EXIT; }
好了,估计是历史原因吧,既然都一样,exit词义上友好些,用它吧。
return也是语言结构,使用上,只是中止当前有效域。不要使用括号,可以返回变量$,全局范围不要直接返回字符串和数字(函数中不限制)。然而,notes中Anonim的注释让我迷惑了:
$_SESSION['text'] = 'Best PHP'; function getText() { $text = $_SESSION['text']; return $text; unset($_SESSION['text']); } echo getText().'<br />'; echo $_SESSION['text'];
他说:
This will output:
Best PHP
Best PHP
Twice, because we have used unset() function after 'return'.
我进行几次测试,注意,gettext已经被内部扩展占用,需要换一个函数名。终于明白,return后面的代码是不执行的。啊哈哈,这人家概念中不解释了么,我原本理解为,return后还会执行……逗比了。
好了,午休会儿。