Menu
Coddy logo textTech

복습 - 사용자 지정 컬렉션

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

challenge icon

챌린지

쉬움

이 장에서 배운 모든 매직 메서드를 하나로 모으는 Collection 클래스를 만들어 봅시다. 여러분의 collection은 자연스럽게 사용할 수 있는 유연한 데이터 컨테이너로 동작합니다. 즉, 키로 항목을 저장하고, 항목이 존재하는지 확인하고, 항목을 동적으로 찾고, 독립적인 복사본을 만들 수 있습니다.

코드는 두 개의 파일로 구성합니다.

  • Collection.php: 항목을 private array에 저장하는 Collection 클래스를 Create합니다. collection은 다음 매직 메서드들이 함께 작동하도록 지원해야 합니다.
    • __construct(): 초기 항목의 선택적 array를 Accepts합니다 (default는 빈 array)
    • __get($key): 주어진 키의 항목을 반환하거나, 해당 항목이 exist하지 않으면 null을 반환합니다.
    • __set($key, $value): 주어진 키에 값을 저장합니다.
    • __isset($key): 키가 collection에 exists하는지 반환합니다.
    • __unset($key): 주어진 키의 항목을 제거합니다.
    • __call($method, $args): dynamic finder 메서드를 처리합니다. findBy로 시작하는 메서드(예: findByRole 또는 findByStatus)가 호출되면, 필드 이름을 extract하고 ("findBy" 뒤의 부분을 lowercase로 변환), 모든 항목을 검색한 다음, 해당 필드가 첫 번째 argument와 일치하는 first 항목의 키를 반환합니다. 일치하는 항목이 없으면 null을 반환합니다. 그 외의 모든 메서드에 대해서는 "Unknown method: [method]"를 반환합니다.
    • __toString(): 항목의 개수인 count를 사용하여 "Collection([count] items)"를 반환합니다.
    • __clone(): cloned될 때 items array는 원본에 대한 reference가 아닌 새 copy여야 합니다.
  • main.php: Collection 파일을 Include합니다. 세 가지 입력, 즉 키 이름, role 값, search role을 받습니다. 사용자의 collection을 만들고 모든 매직 메서드를 시연합니다.
    • 새로운 Collection을 Create합니다.
    • 입력 키를 사용하여 사용자를 Add하고, "name"은 키로, "role"은 입력 role 값으로 설정한 array를 저장합니다.
    • 키가 "bob"인 another 사용자를 Add하고, ["name" => "Bob", "role" => "editor"]를 저장합니다.
    • isset()을 사용하여 입력 키가 exists하는지 출력합니다. 출력값은 "exists" 또는 "missing"입니다.
    • search role을 argument로 사용하여 dynamic findByRole() 메서드를 calling한 결과를 출력합니다. (일치하는 사용자의 키를 반환하거나, null이면 아무것도 반환하지 않아야 합니다.)
    • echo를 사용하여 collection을 출력합니다 (__toString을 트리거합니다).
    • collection을 Clone한 다음, Clone된 collection에서 입력 키를 unset합니다.
    • original collection에서 입력 키가 exists하는지 출력합니다. 출력값은 "exists" 또는 "missing"입니다. (Clone이 independent하므로 여전히 존재해야 합니다.)

각 출력은 각각 별도의 줄에 표시되어야 합니다. dynamic finder는 collection의 각 항목이 "name""role"과 같은 field를 가진 associative array라고 가정합니다.

직접 해보기

<?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: 컬렉션을 복제한 다음, 복제본에서 입력 키를 unset

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

?>

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

직접 연습해 보세요: 온라인 PHP 컴파일러