#例外処理について覚えていく
###例1)まずエラーを出す
<?php
class Entree
{
public $name;
public $ingredients = [];
public function __construct($name, $ingredients)
{
if (!is_array($ingredients)) {
throw new Exception('$ingredientsは配列を指定してください');
}
$this->name = $name;
$this->ingredients = $ingredients;
}
public function hasIngredient($ingredient)
{
return in_array($ingredient, $this->ingredients);
}
}
//ドリンクインスタンス
$drink = new Entree('1杯の牛乳','milk');
if($drink->hasIngredient('milk')){
print 'うまい';
}
上記コードは
Fatal error: Uncaught Exception: $ingredientsは配列を指定してください in /Applications/MAMP/htdocs/test/class1.php:11
Stack trace:
#0 /Applications/MAMP/htdocs/test/class1.php(34): Entree->__construct('1\xE6\x9D\xAF\xE3\x81\xAE\xE7\x89\x9B\xE4\xB9\xB3', 'milk')
#1 {main}
thrown in /Applications/MAMP/htdocs/test/class1.php on line 11
こういったエラーを出す。
原因はドリンクインスタンスの第二引数で配列を使用していない為。
この件については過去記事
PHP classについて(基本)コンストラクタ使い方 / staticを使用したメソッド呼び出し / selfの使用 / 例外処理について
PHP try{}catch, throw, Exceptionの考え方(基本)
にて説明。
こういったエラーに対応する為には
1. 例外を発行する可能性のあるコードをtryブロック内に入れる
2. 問題に対応する為に、例外を発行する可能性のあるコードの後ろにcatchブロックを使用する。
###修正例)
//ドリンクインスタンス
try{
$drink = new Entree('1杯の牛乳','milk');
if($drink->hasIngredient('milk')){
print 'うまい';
}
}catch(Exception $e){
print "ドリンクは結果を表示出来ません。" .$e->getMessage();
}
結果
/*
ドリンクは結果を表示出来ません。$ingredientsは配列を指定してください
*/
ドリンクインスタンス部分を上記のようにtry{}catch(){}で囲む
するとエラーの結果が分かりやすいエラー文になる。