#extendsについて学ぶ
参考:初めてのphp(オライリー)
###例1)
<?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('鳥スープ2', ['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
//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('鳥スープ2', ['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";
}
}
}
結果
//結果は同じ
追加部分はここ
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');
}
}
}
ここはまだよく分かっていない。