【问题标题】:php restore_error_handler not work as expectedphp restore_error_handler 无法按预期工作
【发布时间】:2017-07-19 12:29:10
【问题描述】:
error_reporting(-1);

set_error_handler(function ($level, $message, $file = '', $line = 0) {
   echo '1--------------NOTICE or WARNING';
});

set_error_handler(function ($level, $message, $file = '', $line = 0) {
   echo '2--------------NOTICE or WARNING';

   set_error_handler(function($level, $message, $file = '', $line = 0) {
       echo '3--------Handler';
   });
   restore_error_handler();
});

$arr = [];
var_dump($arr["a"]);
var_dump($arr["b"]);

输出:

2--------------NOTICE or WARNINGNULL
1--------------NOTICE or WARNINGNULL

php版本:7.0.10

如上面的输出,处理程序中的restore_error_handler 似乎无法正常工作。

我希望 error_handler 变为 2,但 error_handler 回到 1。

【问题讨论】:

    标签: php error-handling


    【解决方案1】:

    这很奇怪,但它似乎不适用于回调函数。我不知道为什么。尽管如此,这仍然有效:

    function foo1() {echo "<br>1<br>";}
    function foo2() {echo "<br>2<br>"; restore_error_handler();}
    function foo3() {echo "<br>3<br>"; restore_error_handler();}
    
    set_error_handler("foo1");    //current error handler: foo1
    set_error_handler("foo2");    //current error handler: foo2
    set_error_handler("foo3");    //current error handler: foo3
    
    $arr = [];
    var_dump($arr["a"]);
    var_dump($arr["b"]);
    var_dump($arr["c"]);
    

    显示:

    3

    2

    1

    【讨论】:

    • 如果您将set_error_handler 添加到 foo3。像function foo3() {echo "&lt;br&gt;3&lt;br&gt;"; set_error_handler(function(){echo 'XXX';}); restore_error_handler();} 你会得到3 2 的输出。这和我的问题一样。 -(
    猜你喜欢
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 2014-12-09
    相关资源
    最近更新 更多