Menu
Coddy logo textTech

요약 - 커스텀 컬렉션

Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 91개 중 50번째.

challenge icon

챌린지

쉬움

이 장에서 배운 모든 매직 메서드들을 하나로 모으는 Collection 클래스를 만들어 봅시다. 여러분의 컬렉션은 키별로 항목을 저장하고, 존재 여부를 확인하며, 동적으로 항목을 찾고, 독립적인 복사본을 생성하는 등 사용하기 자연스러운 유연한 데이터 컨테이너 역할을 하게 될 것입니다.

코드는 두 개의 파일로 구성됩니다:

  • Collection.php — 항목을 프라이빗 배열에 저장하는 Collection 클래스를 생성하세요. 여러분의 컬렉션은 다음과 같은 매직 메서드들이 함께 작동하도록 지원해야 합니다:
    • __construct() — 초기 항목들로 구성된 선택적 배열을 받습니다 (기본값은 빈 배열)
    • __get($key) — 주어진 키에 해당하는 항목을 반환하거나, 존재하지 않으면 null을 반환합니다
    • __set($key, $value) — 주어진 키에 값을 저장합니다
    • __isset($key) — 컬렉션에 해당 키가 존재하는지 여부를 반환합니다
    • __unset($key) — 주어진 키의 항목을 제거합니다
    • __call($method, $args) — 동적 파인더 메서드를 처리합니다. findBy로 시작하는 메서드(예: findByRole 또는 findByStatus)가 호출되면, 필드 이름("findBy" 뒷부분을 소문자로 변환)을 추출하고 모든 항목을 검색하여 해당 필드가 첫 번째 인자와 일치하는 첫 번째 항목의 키를 반환합니다. 일치하는 항목이 없으면 null을 반환합니다. 그 외의 다른 메서드에 대해서는 "Unknown method: [method]"를 반환합니다.
    • __toString()"Collection([count] items)" 형식을 반환하며, 여기서 count는 항목의 개수입니다
    • __clone() — 복제될 때, items 배열은 원본에 대한 참조가 아닌 새로운 복사본이어야 합니다
  • main.php — Collection 파일을 포함합니다. 키 이름, 역할(role) 값, 검색할 역할 등 세 가지 입력을 받게 됩니다. 사용자 컬렉션을 구축하고 모든 매직 메서드를 시연하세요:
    • 새로운 Collection을 생성합니다
    • 입력받은 키를 사용하여 사용자를 추가합니다. 이때 "name"은 해당 키로, "role"은 입력받은 역할 값으로 설정된 배열을 저장합니다
    • 키가 "bob"인 또 다른 사용자를 추가하고, ["name" => "Bob", "role" => "editor"]를 저장합니다
    • isset()을 사용하여 입력받은 키가 존재하는지 출력합니다 — "exists" 또는 "missing"을 출력합니다
    • 검색할 역할을 인자로 하여 동적 findByRole() 메서드를 호출한 결과를 출력합니다 (일치하는 사용자의 키를 반환해야 하며, null인 경우 아무것도 출력하지 않습니다)
    • echo를 사용하여 컬렉션을 출력합니다 (__toString이 트리거됩니다)
    • 컬렉션을 복제(clone)한 다음, 복제본에서 입력받은 키를 제거(unset)합니다
    • 원본 컬렉션에 입력받은 키가 존재하는지 출력합니다 — "exists" 또는 "missing"을 출력합니다 (복제본은 독립적이므로 원본에는 여전히 존재해야 합니다)

각 출력은 개별 줄에 표시되어야 합니다. 동적 파인더는 컬렉션의 각 항목이 "name""role"과 같은 필드를 가진 연관 배열이라고 가정합니다.

직접 해보기

<?php

require_once 'Collection.php';

// 입력 읽기
$keyName = trim(fgets(STDIN));
$roleValue = trim(fgets(STDIN));
$searchRole = trim(fgets(STDIN));

// TODO: 새로운 Collection 생성

// TODO: 입력받은 키를 사용하여 사용자 추가, "name" => key 및 "role" => roleValue 배열 저장

// TODO: 키 "bob"으로 다른 사용자 추가, ["name" => "Bob", "role" => "editor"] 저장

// TODO: isset()을 사용하여 입력 키의 존재 여부 출력 - "exists" 또는 "missing" 출력

// TODO: searchRole을 인자로 하여 findByRole() 호출 결과 출력

// TODO: echo를 사용하여 컬렉션 출력 (__toString 트리거)

// TODO: 컬렉션을 복제(clone)한 후, 복제본에서 입력 키를 unset

// TODO: 원본 컬렉션에 입력 키가 존재하는지 여부 출력 - "exists" 또는 "missing"

?>

객체 지향 프로그래밍의 모든 레슨