복습 - 사용자 지정 컬렉션
Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 91개 중 50번째.
챌린지
쉬움이 장에서 배운 모든 매직 메서드를 하나로 모으는 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 컴파일러