web-dev-qa-db-ja.com

PHP-「非オブジェクトのプロパティを取得しようとしています」エラーをキャッチする方法

「非オブジェクトのプロパティを取得しようとしています」エラーをtry/catchステートメントでキャッチしようとしていますが、失敗しますが、PHPエラーが表示されます。次のように使用しています:

try{
  $id = Model()->find('id=1')->id;
}catch(Exception $e){
  echo 'failed';
}

私の検索機能はオブジェクト(アクティブレコード)を返し、オブジェクトプロップを介してid列にアクセスできます。

ただし、ARが見つからない場合はnullオブジェクトになります。 tryステートメントがこれをキャッチすると思いました。私自身の回避策は、isset()を使用することです。しかし、私はtryステートメントがこのエラーを受け入れてキャッチしない理由について混乱しています。

21
Jay

try..catchは、スローされた例外で機能します。 エラーは例外ではありません。 silence エラーは可能ですが、行わないでください。代わりに、何を取得しているかを適切に確認します。

$result = Model()->find('id=1');
if ($result) {
    $id = $result->id;
} else {
    // handle this situation
}
25
deceze

モデルは例外をスローできる必要があります。

モデルは次のようになります。

class Model{

   public function find($id){
      $result = //do stuff to find by id

      if (!isset($result)){
          throw new Exception("No result was found for id:$id");
      }
      return $result

   }
}

次に、try/catchブロックを使用します。

try{  

    $id = Model()->find('id=1')->id;

}catch(Exception $e){
    echo 'failed';
}

ただし、例外は「例外的な」状況でのみスローされます。例外を使用してプログラムフローを指示することは、それを実行する正しい方法だとは思いません。

そうは言っても、IDプロパティを取得しようとしたときにNULLを返すことが例外的な状況である場合は、例外が適しています。

6
F21