2017-03-17 67 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; 
} 
相關問題