2017-03-17 35 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

に従って実装されているのは、私はJSONのプロパティとしてproducts[1].limits[0].valueを渡され、何products[1]私はnullを返すしなければならないので、これは致命的なエラーが発生しますが存在しないとしましょう。それは私の問題です、私は適切な治療をするためにキャッチに入ることができません。

私を助けることができますか?

+2

ここで「評価」を使用する必要があると思いますか? – miken32

+0

[PHPの致命的なエラーをキャッチするにはどうすればいいですか?](0120-18753) – 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; 
} 
関連する問題