PHP 基本　extends(この記事の内容は学習中）

#extendsについて学ぶ
参考：初めてのphp（オライリー）

###例１）

```php

<?php
//Entreeクラスの拡張

//親クラス
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);
    }
}

//子クラス
class Zensai extends Entree
{
    public function hasIngredient($ingredient)
    {
        foreach ($this->ingredients as $entree) {
            if ($entree->hasIngredient($ingredient)) {
                return true;
            }
        }
        return false;
    }
}

//インスタンス
$soup = new Entree('鳥スープ２', ['chicken', 'water']); //スープインスタンス
$sandwich = new Entree('鳥サンド', ['chicken', 'bread']); //サンドイッチインスタンス
$zensai = new Zensai('Soup + Sandwich', [$soup, $sandwich]); //前菜インスタンス


foreach (['chicken', 'water', 'pickles'] as $ing) {
    if ($zensai->hasIngredient($ing)) {
        if ($zensai->hasIngredient($ing)) {
            print "前菜には食材（{$ing}）が含まれている.\n";
        }
    }
}

結果
/*
前菜には食材（chicken）が含まれている.
前菜には食材（water）が含まれている.
*/
```

上記コードでも適切に動作するが、zensaiのコンストラクタに渡した値が本当にEntreeオブジェクトである保証がない為以下のように子クラスにコンストラクタを追加する

###修正追加コード

```php

<?php
//Entreeクラスの拡張

//親クラス
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);
    }
}

//子クラス
class Zensai extends Entree
{
    public function __construct($name, $entrees)
    {
        parent::__construct($name, $entrees); // Entreeのコンストラクタを参照
        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;
    }
}

//インスタンス
$soup = new Entree('鳥スープ２', ['chicken', 'water']); //スープインスタンス
$sandwich = new Entree('鳥サンド', ['chicken', 'bread']); //サンドイッチインスタンス
$zensai = new Zensai('Soup + Sandwich', [$soup, $sandwich]); //前菜インスタンス


foreach (['chicken', 'water', 'pickles'] as $ing) {
    if ($zensai->hasIngredient($ing)) {
        if ($zensai->hasIngredient($ing)) {
            print "前菜には食材（{$ing}）が含まれている.\n";
        }
    }
}

結果
//結果は同じ
```

追加部分はここ

```php

   public function __construct($name, $entrees)
    {
        parent::__construct($name, $entrees); // Entreeのコンストラクタを参照
        foreach ($entrees as $entree) {
            if (!$entree instanceof Entree) {
                throw new Exception('Elements of$entrees must be Entree objects');
            }
        }
    }
```


ここはまだよく分かっていない。