回答編集履歴

1 あいまいな記述を修正

KiyoshiMotoki

KiyoshiMotoki score 4723

2016/07/05 01:30  投稿

yambejp様の回答の通り、後者はエラーが発生しても例外が投げられません。
例外的(PHP の例外機構ではなく、言葉通りの意味ですw)に、
`PDO`クラスのコンストラクタ(`new PDO(...)`のこと)だけは、
`ATTR_ERRMODE` の設定によらずDBへの接続に失敗した場合に`PDOException`を投げます。
[http://php.net/manual/ja/pdo.error-handling.php](http://php.net/manual/ja/pdo.error-handling.php)
> PDO::__construct() は、接続に失敗した場合は常に PDOException をスローします。 これは、現在設定されている PDO::ATTR_ERRMODE が何であっても同じです。
後者のコードでは、それ以降の操作では一切、例外が投げられる事はありません。
後者のコードでは、それ以降の操作では一切、DB関連の例外が投げられる事はありません。
---
ちなみに、`ATTR_ERRMODE`の設定を変更する別の手段として、
「`PDO`クラスのコンストラクタの第4引数で指定する」
という方法もあります。
[http://php.net/manual/ja/pdo.construct.php](http://php.net/manual/ja/pdo.construct.php)
具体的には、以下のように記述します。
```php
$dbh = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
```
どちらの方法も動作的な違いはありませんので、好みで選択すれば良いと思います。
---
いずれの方法を選択するにしても、`PDO`オブジェクトを生成する処理は関数化するなどしてソースコード内の**1箇所だけ**に記述する事をお勧めします。
そうすれば、エラーモードの「設定し忘れ」を防ぐ事ができるからです。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る