<?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개를 정확히 이해를 할 수 있는 기회를 가진다는게 중요하다고 머리에 주입을 하면서 아주 느린 진도로 게으르게 공부를 하고 있습니다. ㅎ

웹지기

profile
10년을 다루다 보니 이제 간단한 것도 만들고 커뮤니티 운영에 관한 다양한 노하우가 있습니다. 어려운 점이나 가지신 생각을 함께 소통해 보아요.
https://rxtip.kr/ 라이믹스 꿀팁
  • profile

    예시가 정말 구리네요. 심지어 부모 클래스와 자식 클래스의 생성자 함수에 들어가는 변수명이 달라서 최근 버전이라면 경고가 뜰 것 같습니다. 온라인이든 오프라인이든 읽는 사람의 수준과 편의를 전혀 고려하지 않고 자기 생각대로만 싸놓은 튜토리얼이 너무 많아요. ㅠㅠ

  • profile profile
    이거 php 러닝에 나오는 객체 설명인데 저렇게 설명해 놓아서 parent::__construct 이해를 못할뻔 했습니다.

    물론 부모 클래스의 생성자를 그대로 재활용 한다는 개념에서는 아주 적합한 예시인데 문제는 부모 클래스에서 사용한 것과 자식 클래스에서 사용하는 것이 연관성이 없다보니 오히려 난해해지는 문제가 발생하는 것 같습니다.

    물론 저렇게 하지 않는다면 자식 클래스에서 생성자 매서드에서 새로운 변수로 정의해서 사용하면 될텐데 그러면 parent::__construct 사용이 필요 없어지니 굳이 부모 클래스의 것을 그대로 인용하는 것을 설명한 것 같습니다.
  • profile profile
    __construct($name, $ingredients)

    이안에 들어가는 인자의 변수가 부모,자식 동일하게 써야 하나요??
    자식 클래스에서는 인자를 더 많이 가지는 케이스로 설명한게 더 쉬워서 이상하게 안봤는데요....
  • profile profile
    생성자의 파라미터 이름 정도는 괜찮은 것 같네요. 그러나 타입 자체가 달라진다거나 하면 최근에는 점점 더 엄격해지는 추세입니다.
  • profile profile
    그냥 동물이나 자동차 같은 것으로 설명하면 (예: class Pomeranian extends Dog, class Sonata extends Car) 누구나 이해하기 쉬울 텐데.... 서로 상속 관계도 아닌 콤보 식사와 엔트리를 예로 들었네요.