Php 寄存器\关闭\函数未捕获致命错误:(未捕获错误未设置静态属性示例,调用未定义函数prom())

Php 寄存器\关闭\函数未捕获致命错误:(未捕获错误未设置静态属性示例,调用未定义函数prom()),php,error-handling,Php,Error Handling,我有这个: 我有一个HTTACCESS文件,其中有一个指令,用于在配置文件前添加一个文件并处理错误:(这是必需的:根据文档,在执行任何其他php脚本之前必须附加该文件,以获得错误:例如E_PARSE。) conferror.php的内容: <?php declare(strict_types=1); ini_set('session.gc_maxlifetime', '0'); ini_set('session.use_only_cookies', '1'); ini_set('sess

我有这个:

  • 我有一个HTTACCESS文件,其中有一个指令,用于在配置文件前添加一个文件并处理错误:(这是必需的:根据文档,在执行任何其他php脚本之前必须附加该文件,以获得错误:例如E_PARSE。)

  • conferror.php的内容:

    <?php
    declare(strict_types=1);
    ini_set('session.gc_maxlifetime', '0');
    ini_set('session.use_only_cookies', '1');
    ini_set('session.cookie_httponly', '1');
    ini_set('allow_url_fopen', '1');
    ini_set('allow_url_include', '1');
    ini_set('error_reporting', '1');
    ini_set('display_errors', '0');
    error_reporting(E_ALL);
    set_error_handler("ErrorHandler");
    register_shutdown_function("ShutdownHandler");
    function ErrorHandler($error_level, $error_message, $error_file, $error_line, $error_context) {
        $ErrorHandler = "<b>File:</b> " . $error_file . '<br>' .
            "<b>Line :</b> " . $error_line . '<br>' .
            "<b>Desc:</b> <br>" . $error_message . '<br>';
        echo $ErrorHandler;
        exit;
    }
    function ShutdownHandler() {
        $CheckError = error_get_last();
        if ($CheckError != null) {
            $ErrorHandler = "<b>File:</b> " . $CheckError['file'] . '<br>' .
                "<b>Line :</b> " . $CheckError['line'] . '<br>' .
                "<b>Desc:</b> <br>" . $CheckError['message'] . '<br>';
            echo $ErrorHandler;
            exit;
        }
    }
    ?>
    
    
    
  • 在我的index.php中,我有以下内容来开始应用程序的工作:

    <?php
        require_once 'class.Main.php';
        $WebAPP = new CORE();
        $WebAPP->Main();
    ?>
    
    
    
  • 在主文件中,我有一个测试,此代码用于取消设置静态对象和测试错误处理程序:

    <?php
    class CORE {
        public static $ObjClass;
        public function __construct() {
            self::$ObjClass['data']='data';
        }
        public function __destruct() {
            unset(CORE::$ObjClass);
        }
        public function Main() {
            #not Test on this.
        }
    }
    ?>
    
    
    
  • 我有3个问题:

  • 为什么事件处理程序不捕获以下错误
  • 致命错误:未捕获错误:尝试取消设置C:\xampp\htdocs\dev\t2\class.Main.php中的静态属性CORE:$ObjClass:8堆栈跟踪:#0[内部函数]:CORE->u destruct()#1{Main}在第8行的C:\xampp\htdocs\dev\t2\class.Main.php中抛出

    第二次测试:

    php_value auto_prepend_file "./server/conferror.php"
    
    <?php
    declare(strict_types=1);
    ini_set('session.gc_maxlifetime', '0');
    ini_set('session.use_only_cookies', '1');
    ini_set('session.cookie_httponly', '1');
    ini_set('allow_url_fopen', '1');
    ini_set('allow_url_include', '1');
    ini_set('error_reporting', '1');
    ini_set('display_errors', '0');
    error_reporting(E_ALL);
    register_shutdown_function("ShutdownHandler");
    set_error_handler("ErrorHandler");
    set_exception_handler("ExeptionHandler");
    function ShutdownHandler() {
        $CheckError = error_get_last();
        if ($CheckError != null) {
            $ErrorHandler = "<b>File:</b> " . $CheckError['file'] . '<br>' .
                "<b>Line:</b> " . $CheckError['line'] . '<br>' .
                "<b>Desc:</b> <br>" . $CheckError['message'] . '<br>';
            echo $ErrorHandler;
        }
    }
    function ErrorHandler($error_level, $error_message, $error_file, $error_line, $error_context) {
        $ErrorHandler = "<b>File:</b> " . $error_file . '<br>' .
            "<b>Line:</b> " . $error_line . '<br>' .
            "<b>Desc:</b> <br>" . $error_message . '<br>';
        echo $ErrorHandler;
    }
    function ExeptionHandler($e) {
        $ErrorHandler = "<b>File:</b> " . $e->getFile() . '<br>' .
            "<b>Line:</b> " .  $e->getLine() . '<br>' .
            "<b>Desc:</b> <br>" .  $e->getMessage() . '<br>';
        echo $ErrorHandler;
    }
    ?>
    
    <?php
        require_once 'class.Main.php';
        $WebAPP = new CORE();
        $WebAPP->Main();
    ?>
    
    <?php
    class CORE {
        public static $ObjClass;
        public function Main() {
            #not Test on this.
            self::$ObjClass['data'] = 'data';
            unset(CORE::$ObjClass);
        }
    }?>
    
    此代码:

    <?php
    class CORE {
        public function __construct() {
        }
        public function __destruct() {
            prom();
        }
        public function Main() {
            #not Test on this.
        }
    }
    ?>
    
    
    
    生成此错误:

    致命错误:未捕获错误:调用C:\xampp\htdocs\dev\t2\class.Main.php中未定义的函数prom():6堆栈跟踪:#0[内部函数]:在第6行的C:\xampp\htdocs\dev\t2\class.Main.php中抛出的CORE->u destruct()#1{Main}

    更新:

    php_value auto_prepend_file "./server/conferror.php"
    
    <?php
    declare(strict_types=1);
    ini_set('session.gc_maxlifetime', '0');
    ini_set('session.use_only_cookies', '1');
    ini_set('session.cookie_httponly', '1');
    ini_set('allow_url_fopen', '1');
    ini_set('allow_url_include', '1');
    ini_set('error_reporting', '1');
    ini_set('display_errors', '0');
    error_reporting(E_ALL);
    register_shutdown_function("ShutdownHandler");
    set_error_handler("ErrorHandler");
    set_exception_handler("ExeptionHandler");
    function ShutdownHandler() {
        $CheckError = error_get_last();
        if ($CheckError != null) {
            $ErrorHandler = "<b>File:</b> " . $CheckError['file'] . '<br>' .
                "<b>Line:</b> " . $CheckError['line'] . '<br>' .
                "<b>Desc:</b> <br>" . $CheckError['message'] . '<br>';
            echo $ErrorHandler;
        }
    }
    function ErrorHandler($error_level, $error_message, $error_file, $error_line, $error_context) {
        $ErrorHandler = "<b>File:</b> " . $error_file . '<br>' .
            "<b>Line:</b> " . $error_line . '<br>' .
            "<b>Desc:</b> <br>" . $error_message . '<br>';
        echo $ErrorHandler;
    }
    function ExeptionHandler($e) {
        $ErrorHandler = "<b>File:</b> " . $e->getFile() . '<br>' .
            "<b>Line:</b> " .  $e->getLine() . '<br>' .
            "<b>Desc:</b> <br>" .  $e->getMessage() . '<br>';
        echo $ErrorHandler;
    }
    ?>
    
    <?php
        require_once 'class.Main.php';
        $WebAPP = new CORE();
        $WebAPP->Main();
    ?>
    
    <?php
    class CORE {
        public static $ObjClass;
        public function Main() {
            #not Test on this.
            self::$ObjClass['data'] = 'data';
            unset(CORE::$ObjClass);
        }
    }?>
    
    经过多次测试,我发现错误处理程序可以很好地处理声明函数中的错误;但这在
    \u构造
    \u解构
    函数中不起作用

  • 为什么我不能取消设置静态属性CORE:$ObjClass或self:$ObjClass
  • 好问题。我在
    unset()
    的官方文档或静态属性中没有看到任何提到这一点的内容。但显然你不能

  • 使用静态属性的正确方法是什么
  • 您可以将其设置为
    NULL
    或空数组

  • 为什么事件处理程序不捕获以下错误
  • 报告说:

    无法使用用户定义的函数处理以下错误类型:
    E\u error
    E\u PARSE
    E\u CORE\u error
    E\u CORE\u WARNING
    E\u COMPILE\u error
    E\u COMPILE\u WARNING
    ,以及调用
    set\u error\u handler()的文件中提出的大部分
    E\u STRICT

    此错误可能是这些类型中的一种。我不知道如何具体说出它的类型


    正在调用shutdown函数,但由于某种原因,
    error\u get\u last()
    返回的是
    NULL
    ,而不是有关此错误的信息。

    在文档和联机中进行了大量搜索。

    不清楚为什么错误处理程序在
    \uuuu构造
    \uu说明
    中不能正常工作;但作为一个遥远的想法,我假设这两个函数甚至在解释
    HTTACCESS
    文件之前就已经过验证,或者即使执行了文件,指令:
    php\u value auto\u prepend\u file
    也在验证两个函数
    \u construct
    \u descruct
    之后执行,这严重影响了如何处理错误,并可能导致实现不如以下解决方案那么舒适的解决方案

    作为第一点,我必须实施另一套我以前没有读过或在研究中发现的方法:

    set_exception_handler ("ExeptionHandler");
    
    我想我将不得不在一定程度上实施其他措施

    作为个人发展的第二点:您应该从使用这些
    \uuuu construc
    \uuu destruct
    中的任何方法开始,并迁移到在声明的方法中嵌套所有内容

    然后脚本和结构如下所示:

    HTTACCESS文件(相同):

    php_value auto_prepend_file "./server/conferror.php"
    
    <?php
    declare(strict_types=1);
    ini_set('session.gc_maxlifetime', '0');
    ini_set('session.use_only_cookies', '1');
    ini_set('session.cookie_httponly', '1');
    ini_set('allow_url_fopen', '1');
    ini_set('allow_url_include', '1');
    ini_set('error_reporting', '1');
    ini_set('display_errors', '0');
    error_reporting(E_ALL);
    register_shutdown_function("ShutdownHandler");
    set_error_handler("ErrorHandler");
    set_exception_handler("ExeptionHandler");
    function ShutdownHandler() {
        $CheckError = error_get_last();
        if ($CheckError != null) {
            $ErrorHandler = "<b>File:</b> " . $CheckError['file'] . '<br>' .
                "<b>Line:</b> " . $CheckError['line'] . '<br>' .
                "<b>Desc:</b> <br>" . $CheckError['message'] . '<br>';
            echo $ErrorHandler;
        }
    }
    function ErrorHandler($error_level, $error_message, $error_file, $error_line, $error_context) {
        $ErrorHandler = "<b>File:</b> " . $error_file . '<br>' .
            "<b>Line:</b> " . $error_line . '<br>' .
            "<b>Desc:</b> <br>" . $error_message . '<br>';
        echo $ErrorHandler;
    }
    function ExeptionHandler($e) {
        $ErrorHandler = "<b>File:</b> " . $e->getFile() . '<br>' .
            "<b>Line:</b> " .  $e->getLine() . '<br>' .
            "<b>Desc:</b> <br>" .  $e->getMessage() . '<br>';
        echo $ErrorHandler;
    }
    ?>
    
    <?php
        require_once 'class.Main.php';
        $WebAPP = new CORE();
        $WebAPP->Main();
    ?>
    
    <?php
    class CORE {
        public static $ObjClass;
        public function Main() {
            #not Test on this.
            self::$ObjClass['data'] = 'data';
            unset(CORE::$ObjClass);
        }
    }?>
    
    conferror.php(使用新集合更新):

    php_value auto_prepend_file "./server/conferror.php"
    
    <?php
    declare(strict_types=1);
    ini_set('session.gc_maxlifetime', '0');
    ini_set('session.use_only_cookies', '1');
    ini_set('session.cookie_httponly', '1');
    ini_set('allow_url_fopen', '1');
    ini_set('allow_url_include', '1');
    ini_set('error_reporting', '1');
    ini_set('display_errors', '0');
    error_reporting(E_ALL);
    register_shutdown_function("ShutdownHandler");
    set_error_handler("ErrorHandler");
    set_exception_handler("ExeptionHandler");
    function ShutdownHandler() {
        $CheckError = error_get_last();
        if ($CheckError != null) {
            $ErrorHandler = "<b>File:</b> " . $CheckError['file'] . '<br>' .
                "<b>Line:</b> " . $CheckError['line'] . '<br>' .
                "<b>Desc:</b> <br>" . $CheckError['message'] . '<br>';
            echo $ErrorHandler;
        }
    }
    function ErrorHandler($error_level, $error_message, $error_file, $error_line, $error_context) {
        $ErrorHandler = "<b>File:</b> " . $error_file . '<br>' .
            "<b>Line:</b> " . $error_line . '<br>' .
            "<b>Desc:</b> <br>" . $error_message . '<br>';
        echo $ErrorHandler;
    }
    function ExeptionHandler($e) {
        $ErrorHandler = "<b>File:</b> " . $e->getFile() . '<br>' .
            "<b>Line:</b> " .  $e->getLine() . '<br>' .
            "<b>Desc:</b> <br>" .  $e->getMessage() . '<br>';
        echo $ErrorHandler;
    }
    ?>
    
    <?php
        require_once 'class.Main.php';
        $WebAPP = new CORE();
        $WebAPP->Main();
    ?>
    
    <?php
    class CORE {
        public static $ObjClass;
        public function Main() {
            #not Test on this.
            self::$ObjClass['data'] = 'data';
            unset(CORE::$ObjClass);
        }
    }?>
    

    目前,这是我们所能做的一切。如果我以后发现新信息,我会更新它。

    @Barmar是我想说的,我解释的只是对错误处理程序实现的测试。@xakepp35是的,当然你说的一切都很容易。。。但你不知道背后是什么:责任、成本、开支。想象一下,告诉一个客户,他将因为投资X而遭受网络许可证增加的痛苦……我并不寻求被推荐改变技术;我试图用当前平台提供的工具来解决这个问题,而不是新的。@WalterNuñez您确定“/server/conferror.php”路径正确吗?这意味着在
    .htaccess
    的后面有一个名为
    server
    的目录,并且
    conferror.php
    文件包含在该目录中。您能确认
    服务器
    文件夹就在
    .htaccess
    的后面吗?您好,是的,路径正确,是的
    .htaccess
    文件与
    服务器
    目录的路径接近。关于第三个问题,你的回答完全正确;但是对于处理程序的致命错误,我使用了e
    register\u shutdown\u function()
    。我不知道。正在调用该函数(我添加了一个
    echo
    来确认),但是
    error\u get\u last()
    返回
    NULL
    ,因此它不会打印其余部分。我已经设置了ini\u set('display\u errors','0');并放置一个回音以确认并从浏览器中获取错误500…我已检测到该函数在类中声明的所有函数中都有效。。。。问题是在_构造或_析构函数中发生的错误