まとめ - カスタムコレクション
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 50/91。
チャレンジ
簡単この章で学んだすべてのマジックメソッドを統合する Collection クラスを作成しましょう。このコレクションは、キーによるアイテムの保存、存在確認、動的なアイテム検索、独立したコピーの作成など、自然な感覚で使用できる柔軟なデータコンテナとして機能します。
コードは2つのファイルに分けて構成します:
Collection.php— アイテムをプライベート配列に保存するCollectionクラスを作成します。コレクションは、以下のマジックメソッドが連携して動作するようにサポートする必要があります:__construct()— オプションで初期アイテムの配列を受け取ります(デフォルトは空の配列)__get($key)— 指定されたキーのアイテムを返します。存在しない場合はnullを返します__set($key, $value)— 指定されたキーに値を保存します__isset($key)— キーがコレクション内に存在するかどうかを返します__unset($key)— 指定されたキーのアイテムを削除します__call($method, $args)— 動的なファインダーメソッドを処理します。findByで始まるメソッド(findByRoleやfindByStatusなど)が呼び出された場合、フィールド名を抽出("findBy" 以降の部分を小文字にする)し、すべてのアイテムを検索して、そのフィールドが第1引数と一致する最初のアイテムのキーを返します。一致するものが見つからない場合はnullを返します。それ以外のメソッドの場合は、"Unknown method: [method]"を返します__toString()—"Collection([count] items)"を返します([count] はアイテム数)__clone()— クローンされたとき、アイテム配列は(元の配列への参照ではなく)新しいコピーである必要があります
main.php— Collection ファイルをインクルードします。3つの入力(キー名、ロール値、検索ロール)を受け取ります。ユーザーのコレクションを構築し、すべてのマジックメソッドを実演します:- 新しい
Collectionを作成します - 入力されたキーでユーザーを追加し、
"name"にそのキーを、"role"に入力されたロール値を設定した配列を保存します - キー
"bob"で別のユーザーを追加し、["name" => "Bob", "role" => "editor"]を保存します isset()を使用して入力キーが存在するかどうかを出力します —"exists"または"missing"を出力します- 検索ロールを引数として動的な
findByRole()メソッドを呼び出した結果を出力します(一致するユーザーのキーを返すか、null の場合は何も出力しません) echoを使用してコレクションを出力します(__toStringがトリガーされます)- コレクションをクローンし、クローンから入力キーを
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: コレクションを複製(クローン)し、複製した方から入力されたキーを削除(unset)する
// TODO: オリジナルのコレクションに入力されたキーが存在するかどうかを出力する - "exists" または "missing"
?>