register_shutdown_function 没有被调用

spi*_*man 4 php

这是我正在测试以处理错误的原始代码的片段。

第一种方法是调用fatalErrorHandler(),但第二种方法不是调用fatalErrorHandler(). 可能是什么原因?

第一的

<?php 
//error_reporting(0);

function fatalErrorHandler() {
    echo 'YAY IT WORKED';
}

# Registering shutdown function
register_shutdown_function('fatalErrorHandler');

// let force a Fatal error -- function does not exist
functiontest();

echo "hello";

?>
Run Code Online (Sandbox Code Playgroud)

输出:

致命错误:在第 12 行的 ...test2.php 中调用未定义的函数 functiontest() YAY IT WORKED

第二

 <?php 
    //error_reporting(0);

    function fatalErrorHandler() {
        echo 'YAY IT WORKED';
    }

    # Registering shutdown function
    register_shutdown_function('fatalErrorHandler');

    // let force a Fatal error -- function does not exist
    functiontest();

    function foo () {

    }

    function foo() {

    }

    echo "hello";

    ?>
Run Code Online (Sandbox Code Playgroud)

输出:

致命错误:无法在第 20 行的 ../test2.php 中重新声明 foo()(之前在 ...test/test2.php:16 中声明)

在这种情况下不会调用致命错误处理程序。为什么?

Hal*_*yon 5

在 PHP 中,您可以在定义函数之前使用它。我认为这意味着解释器必须在开始执行之前解析所有函数。Soregister_shutdown_function在检测到此错误时尚未调用。

您可以通过将重复的函数定义移动到一个单独的文件中并将其包含在include或 中来测试这一点require

  • +1。第二个错误是在解析文件时抛出的,而不是在执行时抛出。由于 Halcyon 所写的原因,解析时未检测到第一个错误。 (2认同)