簡體   English   中英

PhP-如何在靜態類中捕獲致命錯誤

[英]PhP - how to catch fatal errors in a static class

我有一個靜態課程,我希望能夠處理致命錯誤。 我正在粘貼以下方法,以便您更好地理解我的意思:

public static function getInformationDataArrayWithJsonInput($formConfigType, $application_data_json){

    set_error_handler('myErrorHandler');
    register_shutdown_function('fatalErrorShutdownHandler');

    $ret = [];
    $formConfigs = FormConfig::find(array('form_config_type_id='.$formConfigType, 'order" => "ordination ASC'));

    if($formConfigs->count() == 0)
        return $ret;

    $json = $application_data_json;
    //-----------------------------------------------------
    $jsonObj = json_decode($json);

    foreach ($formConfigs as $field){
        $str = "if(\$jsonObj->".$field->json_property."){";
        $str .= "\$ret['".$field->label."'] = \$jsonObj->".$field->json_property.";";
        $str .= "} else {";
        $str .= "\$ret['".$field->label."']=null;";
        $str.="}";

        try{
            eval($str);
        }
        catch (Exception $e)
        {
            die($e->getMessage());

        }
    }

    return $ret;

}

   function fatalErrorShutdownHandler()
{

    die('fatalErrorShutdownHandler');

    $last_error = error_get_last();
    if ($last_error['type'] === E_ERROR) {
        // fatal error
        myErrorHandler(E_ERROR, $last_error['message'], $last_error['file'], $last_error['line']);
    }
}

function myErrorHandler($errno, $errstr, $errfile, $errline)
{

    die('myErrorHandler');

    if (!(error_reporting() & $errno)) {
        // This error code is not included in error_reporting, so let it fall
        // through to the standard PHP error handler
        return false;
    }

    switch ($errno) {
        case E_USER_ERROR:
            echo "<b>My ERROR</b> [$errno] $errstr<br />\n";
            echo "  Fatal error on line $errline in file $errfile";
            echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
            echo "Aborting...<br />\n";
            exit(1);
            break;

        case E_USER_WARNING:
            echo "<b>My WARNING</b> [$errno] $errstr<br />\n";
            break;

        case E_USER_NOTICE:
            echo "<b>My NOTICE</b> [$errno] $errstr<br />\n";
            break;

        default:
            echo "Unknown error type: [$errno] $errstr<br />\n";
            break;
    }

    /* Don't execute PHP internal error handler */
    return true;
}

此方法接收一個json和一個字符串,該字符串的屬性我想從中檢索值。 myErrorHandler和fatalErrorShutDownHandler根據本文實現

假設我將products[1].limits[0].value傳遞為json屬性,並且沒有products[1]會導致致命錯誤,因此我將必須返回null。 那是我的問題,我無法接受適當的治療。

你能幫助我嗎?

您無需在此處使用eval ,並且應盡可能避免使用它。 變量屬性名稱很容易做到,並且通過使用中間變量,您可以更輕松地閱讀。 然后,一個簡單的property_exists()為您完成工作。

$jsonObj = json_decode($json);

foreach ($formConfigs as $field) {
    $prop = $field->json_property;
    $label = $field->label;
    $ret[$label] = property_exists($jsonObj, $prop) ? $jsonObj->$prop : null;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM