为什么不推荐使用php(与已弃用的函数相反)调用error_handler函数?

时间:2011-09-13 18:35:56

标签: php error-handling php-5.3

我正在将代码库从php 5.2升级到5.3。作为其中的一部分,我正在转换我们对已弃用功能和功能的使用。当我们使用像split和spliti这样的弃用函数时,调用我们通过调用set_error_handler()设置的错误处理程序,我得到一条日志消息。这很棒。

但是,当我使用以下两个弃用的功能时:

  1. 现在不推荐使用引用分配new的返回值。
  2. 现在不推荐使用call-time pass-by-reference。
  3. 未调用错误处理程序,因此我看不到日志消息。如果我调用error_get_last()我看到错误已记录,我也可以在php错误日志中看到它,但我们使用错误处理程序来捕获所有这些错误。我担心我的服务器设置中的某些内容导致某些内容无法正常工作。

    您可以在此处查看已弃用的功能/功能:http://www.php.net/manual/en/migration53.deprecated.php

1 个答案:

答案 0 :(得分:0)

您也可以使用set_error_handler()跟踪已弃用的错误消息。您描述的问题是,在注册错误处理函数之前,给出了这些删除消息。

您命名的两条消息在分析时给出。这意味着如果你太晚注册你的错误处理函数,你就不能再处理它们了(因为它们已经通过了)。

因此解决方案很简单:在解析这些文件之前注册错误处理程序。工作实例:

档案error-handler-deprecated-include.php

<?php

# 1. Assigning the return value of new by reference is now deprecated.
$var = &new stdClass();

# 2. Call-time pass-by-reference is now deprecated
trim(&$var);

档案error-handler-deprecated.php

<?php

$handler = function($errno, $errstr, $errfile, $errline) {
    echo "Error: ", var_dump($errno, $errstr, $errfile, $errline), 
         "-----------------------------------\n";
};

echo 'set_error_handler() [previous handler]: ', 
      var_dump(set_error_handler($handler));

# test 1. and 2. by including the code *after* the error handler has been set
include('error-handler-deprecated-include.php');

在PHP 5.3下运行php error-handler-deprecated.php然后生成以下输出,因为您可以看到错误处理程序正在处理其他错误旁边的所有这些已弃用的消息:

set_error_handler() [previous handler]: NULL
Error: int(8192)
string(60) "Assigning the return value of new by reference is deprecated"
string(98) "error-handler-deprecated-include.php"
int(7)
-----------------------------------
Error: int(8192)
string(47) "Call-time pass-by-reference has been deprecated"
string(98) "error-handler-deprecated-include.php"
int(10)
-----------------------------------
Error: int(2)
string(53) "trim() expects parameter 1 to be string, object given"
string(98) "error-handler-deprecated-include.php"
int(10)
-----------------------------------