2015-08-29|复学笔记001

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后还会执行……逗比了。


好了,午休会儿。





你可能感兴趣的:(2015-08-29|复学笔记001)