Menu
CoddyTech

Ôn tập: Bộ sưu tập tùy chỉnh

Thuộc phần Lập trình hướng đối tượng trong hành trình PHP của Coddy. Bài học 50 trên 91.

challenge icon

Thử thách

Dễ

Hãy xây dựng một lớp Collection, kết hợp tất cả các phương thức ma thuật mà bạn đã học trong chương này. Bộ sưu tập của bạn sẽ hoạt động như một vùng chứa dữ liệu linh hoạt, dễ sử dụng: lưu trữ các mục theo khóa, kiểm tra xem chúng có tồn tại không, tìm mục một cách linh hoạt và tạo các bản sao độc lập.

Bạn sẽ tổ chức code trong hai tệp:

  • Collection.php: Tạo một lớp Collection lưu trữ các mục trong một mảng riêng tư. Bộ sưu tập của bạn nên hỗ trợ các phương thức ma thuật sau hoạt động cùng nhau:
    • __construct(): Nhận một mảng các mục ban đầu không bắt buộc (mặc định là mảng rỗng)
    • __get($key): Trả về mục tại khóa đã cho, hoặc null nếu mục đó không tồn tại
    • __set($key, $value): Lưu giá trị tại khóa đã cho
    • __isset($key): Trả về kết quả cho biết khóa có tồn tại trong bộ sưu tập hay không
    • __unset($key): Xóa mục tại khóa đã cho
    • __call($method, $args): Xử lý các phương thức tìm kiếm động. Khi gọi một phương thức bắt đầu bằng findBy (chẳng hạn như findByRole hoặc findByStatus), hãy trích xuất tên trường (chuyển phần sau "findBy" thành chữ thường), tìm trong tất cả các mục và trả về khóa của mục đầu tiên có trường đó khớp với đối số đầu tiên. Trả về null nếu không tìm thấy kết quả khớp. Với bất kỳ phương thức nào khác, trả về "Unknown method: [method]"
    • __toString(): Trả về "Collection([count] items)", trong đó count là số lượng mục
    • __clone(): Khi được sao chép, mảng mục phải là một bản sao mới (không phải tham chiếu đến bản gốc)
  • main.php: Nạp tệp Collection. Bạn sẽ nhận ba đầu vào: tên khóa, giá trị vai trò và vai trò cần tìm. Tạo một bộ sưu tập người dùng và minh họa tất cả các phương thức ma thuật:
    • Tạo một Collection mới
    • Thêm một người dùng với khóa đầu vào, lưu một mảng có "name" được đặt thành khóa và "role" được đặt thành giá trị vai trò đầu vào
    • Thêm một người dùng khác với khóa "bob", lưu ["name" => "Bob", "role" => "editor"]
    • In ra liệu khóa đầu vào có tồn tại hay không bằng isset(): xuất "exists" hoặc "missing"
    • In ra kết quả gọi phương thức động findByRole() với vai trò cần tìm làm đối số (phương thức này sẽ trả về khóa của người dùng khớp, hoặc không trả về gì nếu kết quả là null)
    • In bộ sưu tập bằng echo (kích hoạt __toString)
    • Sao chép bộ sưu tập, sau đó bỏ đặt khóa đầu vào khỏi bản sao
    • In ra liệu khóa đầu vào có tồn tại trong bộ sưu tập gốc hay không: xuất "exists" hoặc "missing" (khóa này vẫn nên tồn tại vì bản sao độc lập)

Mỗi kết quả đầu ra phải nằm trên một dòng riêng. Phương thức tìm kiếm động giả định mỗi mục trong bộ sưu tập là một mảng kết hợp có các trường như "name" và "role".

Tự làm thử

<?php

require_once 'Collection.php';

// Đọc dữ liệu đầu vào
$keyName = trim(fgets(STDIN));
$roleValue = trim(fgets(STDIN));
$searchRole = trim(fgets(STDIN));

// TODO: Tạo một Collection mới

// TODO: Thêm một người dùng với khóa đầu vào, lưu mảng có "name" => key và "role" => roleValue

// TODO: Thêm một người dùng khác với khóa "bob", lưu ["name" => "Bob", "role" => "editor"]

// TODO: Dùng isset() để kiểm tra khóa đầu vào có tồn tại hay không, rồi in ra "exists" hoặc "missing"

// TODO: In ra kết quả gọi findByRole() với đối số là searchRole

// TODO: Dùng echo để in ra tập hợp (kích hoạt __toString)

// TODO: Clone tập hợp, rồi xóa khóa đầu vào khỏi bản clone

// TODO: Kiểm tra khóa đầu vào có tồn tại trong tập hợp GỐC hay không, rồi in ra "exists" hoặc "missing"

?>

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch PHP online