<?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 ComboMeal extends Entree {
public function __construct($name, $entrees) {
parent::__construct($name, $entrees);
foreach ($entrees as $entree) {
if (! $entree instanceof Entree) {
throw new Exception('$entrees의 원소는 객체여야 합니다.');
}
}
}
public function hasIngredient($ingredient) {
foreach ($this->ingredients as $entree) {
if ($entree->hasIngredient($ingredient)) {
return true;
}
}
return false;
}
}
// 수프 종류와 재료
$soup = new Entree('닭고기 수프', array('닭고기', '물'));
// 샌드위치 종류와 재료
$sandwich = new Entree('닭고기 샌드위치', array('닭고기', '빵'));
// 세트 메뉴
$combo = new ComboMeal('수프 + 샌드위치', array($soup, $sandwich));
foreach (['닭고기','물','피클', '빵'] as $ing) {
if ($combo->hasIngredient($ing)) {
print " 메뉴에 들어가는 재료: $ing.\n<br>";
}
}
이렇게 어렵게 설명할 수 있을까요 ㅜㅡ
인수 갯수를 부모,자식 모두 똑같이 2개로 해서 자식 클래스에서 부모클래스의 생성자를 호출하지 않으면 작동이 안되는 것에 대한 설명이 자세하게 없어서 이거 이해하는데 3시간 걸린거 같습니다.
차라리 부모 클래스에서의 생성자가 자식클래스에서도 사용되는 케이스를 명확하게 구분되도록 해주었으면 쉽게 이해했을텐데..
코드를 넣었다 빼었다 다른 결과를 보고 쉽게 이해가 가지 않아서 결국 구글링으로 다른 설명 부모 클래스의 인수에 자식 클래스에는 추가적인 다른 인수를 사용해서 자식 클래스에서 별도로 초기화를 해주는 구분된 것으로 처리해 주는 것 보고 겨우 이해했네요.
결국 저기서 parent::__construct($name, $entrees); 가 필요했던 이유는....
자식 클래스 ComboMeal의 메서드에서 객체를 구분하기 위한 $this->ingredients 이게 등장해서 필요했던 거 같은데.....
이게 부모 클래스에 메뉴 재료를 담기 위한 $this->ingredients 를 재활용하기 위해서 이렇게 예시를 들었다는게 와... 이걸 이해한다구요???
$combo->ingredients = array($soup, $sandwich);
이렇게 ComboMeal 클래스에 ingredients 변수에 부모 클래스 사용한 객체 2개를 담기 위해서 였다구... ㅜㅡ
아주 조금씩 php에 관해서 이해를 해보려 하고 있습니다. 하루에 3시간이 걸리던 5시간이 걸리던 모르던 단 1개를 정확히 이해를 할 수 있는 기회를 가진다는게 중요하다고 머리에 주입을 하면서 아주 느린 진도로 게으르게 공부를 하고 있습니다. ㅎ
예시가 정말 구리네요. 심지어 부모 클래스와 자식 클래스의 생성자 함수에 들어가는 변수명이 달라서 최근 버전이라면 경고가 뜰 것 같습니다. 온라인이든 오프라인이든 읽는 사람의 수준과 편의를 전혀 고려하지 않고 자기 생각대로만 싸놓은 튜토리얼이 너무 많아요. ㅠㅠ