「非オブジェクトのプロパティを取得しようとしています」エラーをtry/catchステートメントでキャッチしようとしていますが、失敗しますが、PHPエラーが表示されます。次のように使用しています:
try{
$id = Model()->find('id=1')->id;
}catch(Exception $e){
echo 'failed';
}
私の検索機能はオブジェクト(アクティブレコード)を返し、オブジェクトプロップを介してid列にアクセスできます。
ただし、ARが見つからない場合はnullオブジェクトになります。 tryステートメントがこれをキャッチすると思いました。私自身の回避策は、isset()を使用することです。しかし、私はtryステートメントがこのエラーを受け入れてキャッチしない理由について混乱しています。
try..catch
は、スローされた例外で機能します。 エラーは例外ではありません。 silence エラーは可能ですが、行わないでください。代わりに、何を取得しているかを適切に確認します。
$result = Model()->find('id=1');
if ($result) {
$id = $result->id;
} else {
// handle this situation
}
モデルは例外をスローできる必要があります。
モデルは次のようになります。
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を返すことが例外的な状況である場合は、例外が適しています。