82477
PHPの入門書【「初めてのPHP」オライリー・ジャパン P104 *オブジェクトの拡張】  
を進めています。  
下記に記述しているEntree.phpなのですが、例外を2か所に発行しています。

class Entree内のコンストラクタ内の

```

    if(! is_array($ingredients)){
              throw new Exception('$ingredientsは配列にしてください');
            }
    
```

とサブクラス class ComboModel extends Entree内の

```

    public function __construct($name,$entrees){
          parent::__construct($name, $entrees);
          foreach($entrees as $entree){
            if(! $entree instanceof  Entree){
             throw new Exception ('Elements of $entrees must be Entree objects');
                }
              }
    
```

の2か所です。例外の補足は一か所だけです。

```

    try{
    
    }catch (Exception $e){
     echo $e->getMessege();
    }
    
```

試しにインスタンスの引数をarray以外に変更すると

```

    $soup = new Entree('Chicken Soup','chicken');
    
```

第2引数は配列(array)ではないので  
<表示結果>

```

    $ingredientsは配列にしてください
    
```

とちゃんと例外が処理されています。

ところが２つめのclass ComboModel extends Entree内の例外ですが、  
コンストラクタの２つめの引数$entreesはクラスEntree内にあるオブジェクトでは  
ないので例外が発行され、

```

    Elements of $entrees must be Entree objects
    
```

と表示されないといけないと思うのですが、  
実際の表示は  
<表示結果>

```

    Sandwich contains chicken.
    Sandwich contains bread.
    Something in the combo contains chicken.
    
```

と何事もなく処理されています。

例外が２つ発行され処理が1カ所だけなのが原因なのでしょうか？  
タイプミスなど何度か見返したのですが間違いは見つかりませんでした。  
最初のclass Entree内の例外はちゃんと通知されるのに、  
サブクラス、class ComboModel extends Entree内コンストラクタの例外は無視されているのは何が原因なのでしょうか？

わかる方いらっしゃいましたら教えて下さい。よろしくお願いいたします。

**(Entree.php)**

```

        <?php
    
    class Entree{
      public $name;
      public $ingredients = array();
    
      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);
      }
    }
    
    
    class ComboModel extends Entree{
    
      public function __construct($name,$entrees){
      parent::__construct($name, $entrees);
      foreach($entrees as $entree){
        if(! $entree instanceof  Entree){
         throw new Exception ('Elements of $entrees must be Entree objects');
            }
          }
        }
    
      public function hasIngredient($ingredient){
        foreach ($this->ingredients as $entree){
          if($entree->hasIngredient($ingredient)){
            return true;
          }
        }
        return false;
      }
    
    }
    
    try{
    
    $soup = new Entree('Chicken Soup',array('chicken, water'));
    $sandwich = new Entree('Chicken Sandwich', array('chicken','bread'));
    
      foreach(['chicken','lemon','bread','water'] as $ing){
        if($soup->hasIngredient($ing)){
          print "Soup contains $ing.\n";
          echo "<br>";
        }
        if($sandwich->hasIngredient($ing)){
          print "Sandwich contains $ing.\n";
          echo "<br>";
        }
    
      }
    
    $combo = new ComboModel('Soup + Sandwich',array($soup, $sandwich));
    
      foreach(['chicken','water','pickles'] as $ing){
        if($combo->hasIngredient($ing)){
          print "Something in the combo contains $ing.\n";
          echo "<br>";
        }
      }
    
    }catch (Exception $e){
      echo $e->getMessage();
    }
    
    ?>
    
```
CC BY-SA 4.0
2021-09-13T05:27:14.973
82457
2021-09-14T05:55:51.353
42150
question
php exception
例外の発行がうまくいきません。
まだ初学者でオブジェクト指向という概念の理解が曖昧で、クラスEnree内のプロパティやメソッドにしか目が行っていませんでした。

クラスEntreeからインスタンスが以下の通り作成されていますので、当然これらはEntreeクラスのオブジェクトのインスタンスです。

```

    $soup     = new Entree('Chicken Soup',array('chicken, water'));
    $sandwich = new Entree('Chicken Sandwich', array('chicken','bread'));
    
```

長時間考えていたのですがまだ見方が甘く未熟でした。ご指摘いただた metropolisさんどうもありがとうございました。
CC BY-SA 4.0
2021-09-14T04:55:14.663
82477
2021-09-14T05:55:51.353
2021-09-14T05:55:51.353
3060
42150
82457
answer