2017-03-17 66 views
0

我有一个静态类,我希望能够处理致命错误。我粘贴下面的方法使你更好地理解我的意思:PhP - 如何捕捉静态类中的致命错误

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根据this article

比方说,我通过products[1].limits[0].value为JSON属性并没有products[1]这将导致致命的错误,所以我不得不返回null实现。这是我的问题,我无法深入了解这一点,以便做出适当的治疗。

你能帮我吗?

+2

为什么你认为你需要在这里使用'eval'? – miken32

+0

可能重复的[我如何发现一个PHP致命错误](http://stackoverflow.com/q/277224/1255289) – miken32

+0

@ miken32我看到了这个答案,并且应用了register_shutdown_function并且它从未到达过 –

回答

0

您不需要在这里使用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; 
} 
相关问题