Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】SplObjectStorage::contains()メソッドの使い方

containsメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

containsメソッドは、SplObjectStorageオブジェクトが特定のオブジェクトを含んでいるかどうかを確認するメソッドです。

SplObjectStorageは、PHPの標準拡張機能であるSPL(Standard PHP Library)に含まれる、オブジェクトをキーとしてデータを管理するための特殊なコレクションクラスです。通常の配列とは異なり、オブジェクトそのものをキーとして利用し、各オブジェクトがユニークなキーとして扱われる点が特徴です。このSplObjectStorageに、複数のオブジェクトを格納しておくことができます。

このcontainsメソッドは、SplObjectStorageのインスタンスに対して呼び出され、引数として渡された任意のオブジェクトが、現在そのストレージ内に格納されているかどうかを効率的に調べることができます。メソッドを実行すると、指定されたオブジェクトがSplObjectStorage内に存在する場合にブール値のtrueを返し、存在しない場合にはfalseを返します。

オブジェクトの比較は、値が等しいかどうかではなく、厳密に同じインスタンスであるかどうか(同一のオブジェクトであるか)に基づいて行われます。したがって、たとえ同じプロパティと値を持つオブジェクトであっても、異なるインスタンスであればcontainsメソッドはfalseを返します。この機能は、特定のオブジェクトがコレクションに追加済みであるかを確認したい場合や、重複を避けてオブジェクトを管理したい場合などに非常に有用です。

構文(syntax)

1<?php
2$storage = new SplObjectStorage();
3$objectToCheck = new stdClass();
4
5$storage->contains($objectToCheck);
6?>

引数(parameters)

object $object

  • object $object: 存在を確認したいオブジェクト

戻り値(return)

bool

指定したオブジェクトがSplObjectStorage内に存在するかどうかを真偽値(true/false)で返します。

サンプルコード

SplObjectStorage::contains() でオブジェクト存在確認

1<?php
2
3// オブジェクトを格納するためのシンプルなクラスを定義します。
4class MyObject
5{
6    public string $name;
7
8    public function __construct(string $name)
9    {
10        $this->name = $name;
11    }
12}
13
14// SplObjectStorage のインスタンスを作成します。
15// これはオブジェクトのコレクションを格納し、オブジェクトの同一性に基づいて操作します。
16$storage = new SplObjectStorage();
17
18// いくつかのMyObjectインスタンスを作成します。
19$objectA = new MyObject('アイテム A');
20$objectB = new MyObject('アイテム B');
21$objectC = new MyObject('アイテム C'); // このオブジェクトはストレージに追加しません。
22
23// objectA と objectB をストレージに追加します。
24$storage->attach($objectA);
25$storage->attach($objectB);
26
27echo "--- SplObjectStorage::contains() の使用例 ---\n\n";
28
29// ストレージに objectA が含まれているかを確認します。
30// objectA は追加されているため、true を返します。
31echo "objectAがストレージに含まれているか: ";
32var_dump($storage->contains($objectA));
33
34// objectC がストレージに含まれているかを確認します。
35// objectC は追加されていないため、false を返します。
36echo "objectCがストレージに含まれているか: ";
37var_dump($storage->contains($objectC));
38
39// objectA と同じプロパティを持つが、別のインスタンスである新しいオブジェクトを作成します。
40$objectA_new_instance = new MyObject('アイテム A');
41
42// この新しいインスタンスがストレージに含まれているかを確認します。
43// SplObjectStorage はオブジェクトの同一性(同じメモリ位置を指すか)をチェックするため、
44// プロパティが同じでもインスタンスが異なるため、false を返します。
45echo "objectA_new_instance (objectAと同じ値だが別インスタンス)がストレージに含まれているか: ";
46var_dump($storage->contains($objectA_new_instance));
47
48// ストレージから objectB を削除します。
49$storage->detach($objectB);
50
51// objectB を削除した後、ストレージに含まれているかを確認します。
52// 削除されたため、false を返します。
53echo "objectBをデタッチ後、objectBがストレージに含まれているか: ";
54var_dump($storage->contains($objectB));

SplObjectStorage::contains() メソッドは、PHPの SplObjectStorage クラスに属し、特定のオブジェクトがそのストレージ(コレクション)内に含まれているかどうかを確認するための機能です。

このメソッドには、確認したい object を引数として一つ渡します。戻り値は bool 型で、もし指定されたオブジェクトがストレージに存在すれば true を、存在しなければ false を返します。

SplObjectStorage は、追加されたオブジェクトを「同一性」に基づいて管理します。つまり、メモリ上で全く同じオブジェクトであるかどうかを判断基準とします。そのため、たとえプロパティの値が完全に同じであっても、異なるインスタンスとして作成されたオブジェクトは別物と見なされます。

サンプルコードでは、SplObjectStorageobjectAobjectB が追加されています。contains($objectA)true を返しますが、追加されていない objectC に対する contains($objectC)false を返します。

特に注目すべきは、objectA と同じ内容を持つ別のインスタンス objectA_new_instancecontains() で確認する場面です。SplObjectStorage はインスタンスの同一性をチェックするため、この場合は false となります。また、オブジェクトがストレージから削除(デタッチ)された後も、contains() はそのオブジェクトに対して false を返すようになります。このメソッドは、コレクション内のオブジェクトの存在を効率的に判別する際に役立ちます。

SplObjectStorage::contains()は、通常の配列の検索とは異なり、オブジェクトの「同一性」を厳密に比較します。そのため、オブジェクトのプロパティ値が同じでも、new演算子で生成された別のインスタンスは異なるオブジェクトと判断され、contains()falseを返します。この点が初心者が最も間違いやすいポイントです。このメソッドは、コレクション内に特定のオブジェクトインスタンスが既に存在するかを、そのオブジェクト自体をキーとして効率的に確認したい場合に活用します。引数には必ずオブジェクト型の値を渡してください。

PHP SplObjectStorage contains() によるオブジェクト存在チェック

1<?php
2
3/**
4 * SplObjectStorage::contains() メソッドの使用例
5 *
6 * SplObjectStorageは、オブジェクトをキーとして格納できる特殊なコレクションです。
7 * contains() メソッドは、指定されたオブジェクトがこのストレージに存在するかどうかをチェックします。
8 */
9
10// 1. SplObjectStorage の新しいインスタンスを作成します。
11$objectStorage = new SplObjectStorage();
12
13// 2. テスト用のオブジェクトをいくつか作成します。
14//    ここでは簡単な匿名クラスを使用しますが、どんなオブジェクトでも構いません。
15$object1 = new class {
16    public string $name = 'Object A';
17};
18
19$object2 = new class {
20    public string $name = 'Object B';
21};
22
23// このオブジェクトはストレージには追加しません。
24$object3 = new class {
25    public string $name = 'Object C';
26};
27
28echo "--- オブジェクトの追加 (attach) ---" . PHP_EOL;
29
30// 3. オブジェクトを SplObjectStorage に追加します (attach)。
31$objectStorage->attach($object1);
32echo "{$object1->name} をストレージに追加しました。" . PHP_EOL;
33
34$objectStorage->attach($object2);
35echo "{$object2->name} をストレージに追加しました。" . PHP_EOL;
36
37echo PHP_EOL;
38
39echo "--- contains() メソッドによるオブジェクトの存在チェック ---" . PHP_EOL;
40
41// 4. contains() メソッドを使って、追加したオブジェクトが存在するか確認します。
42echo "{$object1->name} はストレージに含まれていますか? ";
43var_dump($objectStorage->contains($object1)); // 期待値: true
44
45echo "{$object2->name} はストレージに含まれていますか? ";
46var_dump($objectStorage->contains($object2)); // 期待値: true
47
48// 5. contains() メソッドを使って、追加していないオブジェクトが存在するか確認します。
49echo "{$object3->name} はストレージに含まれていますか? ";
50var_dump($objectStorage->contains($object3)); // 期待値: false
51
52// 6. 全く新しいオブジェクトがストレージに含まれているか確認します。
53$anotherObject = new stdClass();
54echo "全く新しいオブジェクトはストレージに含まれていますか? ";
55var_dump($objectStorage->contains($anotherObject)); // 期待値: false

PHPのSplObjectStorageは、オブジェクトそのものをキーとしてデータを格納できる、特別なコレクションクラスです。このSplObjectStorageクラスに用意されているcontains()メソッドは、指定されたオブジェクトがこのストレージ内に存在するかどうかを調べるために利用されます。

引数には、存在を確認したいオブジェクトを渡します。メソッドの戻り値は真偽値(bool)で、指定されたオブジェクトがストレージに含まれていればtrueを、含まれていなければfalseを返します。

サンプルコードでは、最初に$object1$object2という二つのオブジェクトを作成し、SplObjectStorageattach()メソッドで追加しています。その後、contains()メソッドを使ってこれらのオブジェクトの存在をチェックすると、両方ともtrueが返されることがわかります。これは、追加したオブジェクトがストレージに正しく含まれていることを示しています。一方、ストレージに追加していない$object3や、全く新しい$anotherObjectに対してcontains()を実行すると、falseが返されます。この挙動から、contains()メソッドがオブジェクトの同一性に基づいて、その存在を正確に判断していることが理解できます。SplObjectStorage::contains()は、コレクション内に特定のオブジェクトがあるかを効率的に確認したい場合に便利な機能です。

SplObjectStorage::contains()は、指定されたオブジェクトがストレージ内に「同一のインスタンス」として存在するかどうかを確認します。オブジェクトの内容が同じでも、別々に作成されたインスタンスは異なるものとして判断されるため、このオブジェクトの同一性(参照)に着目してください。引数には必ずオブジェクト型を渡す必要があり、それ以外の型ではエラーとなります。メソッドの戻り値は、オブジェクトが存在すればtrue、存在しなければfalseの真偽値です。

関連コンテンツ