PHPの入門書【「初めてのPHP」オライリー・ジャパン P104 *オブジェクトの拡張】
を進めています。
下記に記述しているEntree.phpなのですが、例外を2か所に発行しています。
class Entree内のコンストラクタ内の
php
1if(! is_array($ingredients)){ 2 throw new Exception('$ingredientsは配列にしてください'); 3 }
とサブクラス class ComboModel extends Entree内の
php
1public function __construct($name,$entrees){ 2 parent::__construct($name, $entrees); 3 foreach($entrees as $entree){ 4 if(! $entree instanceof Entree){ 5 throw new Exception ('Elements of $entrees must be Entree objects'); 6 } 7 }
の2か所です。例外の補足は一か所だけです。
php
1try{ 2 3}catch (Exception $e){ 4 echo $e->getMessege(); 5}
試しにインスタンスの引数をarray以外に変更すると
php
1$soup = new Entree('Chicken Soup','chicken');
第2引数は配列(array)ではないので
<表示結果>
php
1$ingredientsは配列にしてください
とちゃんと例外が処理されています。
ところが2つめのclass ComboModel extends Entree内の例外ですが、
コンストラクタの2つめの引数$entreesはクラスEntree内にあるオブジェクトでは
ないので例外が発行され、
Elements of $entrees must be Entree objects
と表示されないといけないと思うのですが、
実際の表示は
<表示結果>
php
1Sandwich contains chicken. 2Sandwich contains bread. 3Something in the combo contains chicken.
と何事もなく処理されています。
例外が2つ発行され処理が1カ所だけなのが原因なのでしょうか?
タイプミスなど何度か見返したのですが間違いは見つかりませんでした。
最初のclass Entree内の例外はちゃんと通知されるのに、
サブクラス、class ComboModel extends Entree内コンストラクタの例外は無視されているのは何が原因なのでしょうか?
わかる方いらっしゃいましたら教えて下さい。よろしくお願いいたします。
(Entree.php)
php
1<?php 2 3class Entree{ 4 public $name; 5 public $ingredients = array(); 6 7 public function __construct($name, $ingredients){ 8 if(! is_array($ingredients)){ 9 throw new Exception('$ingredientsは配列にしてください'); 10 } 11 $this->name = $name; 12 $this->ingredients = $ingredients; 13 } 14 15 public function hasIngredient($ingredient){ 16 return in_array($ingredient, $this->ingredients); 17 } 18} 19 20 21class ComboModel extends Entree{ 22 23 public function __construct($name,$entrees){ 24 parent::__construct($name, $entrees); 25 foreach($entrees as $entree){ 26 if(! $entree instanceof Entree){ 27 throw new Exception ('Elements of $entrees must be Entree objects'); 28 } 29 } 30 } 31 32 public function hasIngredient($ingredient){ 33 foreach ($this->ingredients as $entree){ 34 if($entree->hasIngredient($ingredient)){ 35 return true; 36 } 37 } 38 return false; 39 } 40 41} 42 43try{ 44 45$soup = new Entree('Chicken Soup',array('chicken, water')); 46$sandwich = new Entree('Chicken Sandwich', array('chicken','bread')); 47 48 foreach(['chicken','lemon','bread','water'] as $ing){ 49 if($soup->hasIngredient($ing)){ 50 print "Soup contains $ing.\n"; 51 echo "<br>"; 52 } 53 if($sandwich->hasIngredient($ing)){ 54 print "Sandwich contains $ing.\n"; 55 echo "<br>"; 56 } 57 58 } 59 60$combo = new ComboModel('Soup + Sandwich',array($soup, $sandwich)); 61 62 foreach(['chicken','water','pickles'] as $ing){ 63 if($combo->hasIngredient($ing)){ 64 print "Something in the combo contains $ing.\n"; 65 echo "<br>"; 66 } 67 } 68 69}catch (Exception $e){ 70 echo $e->getMessage(); 71} 72 73?>
回答1件
あなたの回答
tips
プレビュー