【问题标题】:Why don't php deprecated features (as opposed to deprecated functions) call the error_handler function?为什么 php 不推荐使用的功能(相对于不推荐使用的函数)不调用 error_handler 函数?
【发布时间】:2012-12-17 23:45:49
【问题描述】:

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

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

  1. 现在不推荐通过引用分配 new 的返回值。
  2. 现在不推荐使用调用时传递引用。

没有调用错误处理程序,所以我没有看到日志消息。如果我调用error_get_last(),我会看到错误已记录,我也可以在 php 错误日志中看到它,但我们使用错误处理程序来捕获所有这些。我担心我的服务器设置中的某些东西导致某些东西无法正常工作。

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

【问题讨论】:

  • 只是猜测:可能因为两者都不是函数,而是语言结构。
  • 我注意到了这种区别,但我仍然可以通过调用 error_get_last() 来访问错误信息,这似乎仍然很奇怪。这表明它像任何其他错误一样被记录为错误。它的 err_num 为 E_DEPRECATED。

标签: php error-handling php-5.3


【解决方案1】:

您也可以使用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)
-----------------------------------

【讨论】:

    猜你喜欢
    • 2011-10-12
    • 2013-04-25
    • 2019-05-13
    • 2012-11-14
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多