Menu
Coddy logo textTech

まとめ - カスタムコレクション

CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 50/91。

challenge icon

チャレンジ

簡単

この章で学んだすべてのマジックメソッドを統合する Collection クラスを作成しましょう。このコレクションは、キーによるアイテムの保存、存在確認、動的なアイテム検索、独立したコピーの作成など、自然な感覚で使用できる柔軟なデータコンテナとして機能します。

コードは2つのファイルに分けて構成します:

  • Collection.php — アイテムをプライベート配列に保存する Collection クラスを作成します。コレクションは、以下のマジックメソッドが連携して動作するようにサポートする必要があります:
    • __construct() — オプションで初期アイテムの配列を受け取ります(デフォルトは空の配列)
    • __get($key) — 指定されたキーのアイテムを返します。存在しない場合は null を返します
    • __set($key, $value) — 指定されたキーに値を保存します
    • __isset($key) — キーがコレクション内に存在するかどうかを返します
    • __unset($key) — 指定されたキーのアイテムを削除します
    • __call($method, $args) — 動的なファインダーメソッドを処理します。findBy で始まるメソッド(findByRolefindByStatus など)が呼び出された場合、フィールド名を抽出("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"

?>

オブジェクト指向プログラミングのすべてのレッスン