ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
# [SplObjectStorage:对象存储](https://www.php.net/manual/zh/class.splobjectstorage.php#class.splobjectstorage) >[info] 一般用来存储对象 >[danger] splObjectStorage类提供从对象到数据或忽略数据的对象集的映射。这种双重目的在许多情况下都是有用的,包括需要唯一地标识对象。 > 用来存储一组对象的,特别是当你需要唯一标识对象的时候 ``` SplObjectStorage implements Countable , Iterator , Serializable , ArrayAccess { /* 方法 */ //Countable public count ( void ) : int //返回存储中的对象数量 //Iterator public current ( void ) : object //返回当前存储的条目 public key ( void ) : int //返回当前迭代对应的索引 public next ( void ) : void //移到下一条目 public rewind ( void ) : void //将迭代器回到第一个存储的元素 public valid ( void ) : bool //返回当前迭代器条目是否有效 //Serializable public serialize ( void ) : string //序列化存储 返回表示存储的字符串 对继承他的子类使用serialize时触发 public unserialize ( string $serialized ) : void //反序列化存储 对继承他的子类使用unserialize 时触发 //ArrayAccess public offsetExists ( object $object ) : bool //isset(obj)触发 判断存储对象中是否含有指定的对象 public offsetGet ( object $object ) : mixed //从存储中获得一个对象 public offsetSet ( object $object [, mixed $data = NULL ] ) : void //给存储中的对象赋值 public offsetUnset ( object $object ) : void //从存储中删除一个对象 public addAll ( SplObjectStorage $storage ) : void //添加一个指定存储中所有的对象 public attach ( object $object [, mixed $data = NULL ] ) : void //象存储的对象中添加一个对象 public contains ( object $object ) : bool //检查存储中是否包含特定的对象 public detach ( object $object ) : void //从存储对象中删除一个指定的对象 public getHash ( object $object ) : string //给包含的对象计算一个唯一ID public getInfo ( void ) : mixed //返回当前迭代器条目相关的数据 public removeAll ( SplObjectStorage $storage ) : void //从当前存储中删除另一个存储中包含的对象 public removeAllExcept ( SplObjectStorage $storage ) : void //从当前存储中删除另一个存储中不包含的对象 public setInfo ( mixed $data ) : void //设置当前迭代器条目相关的数据 } ``` ## **例子** ``` class Person { public $name; public function __construct(string $name) { $this->name = $name; } } //实例化对象 $zhangsan = new Person('张三'); $lisi = new Person('李四'); $wangwu = new Person('王五'); $zhaoliu = new Person('赵六'); $wangmazi = new Person('王麻子'); //实例化对象存储 $container = new SplObjectStorage(); //往存储空间写入对象 $container->attach($zhangsan); $container->attach($lisi); $container->attach($wangwu); $container->attach($zhaoliu); //统计存储空间里面的对象的数量 echo "存储对象数量" . $container->count();//4 echo "<br/>"; //判断指定的对象是否在存储空间中 echo "是否包含指定对象:"; var_dump($container->contains($lisi));//true var_dump($container->contains($wangmazi));//false echo "<br/>"; //从存储中删除指定对象 echo "删除指定对象"; $container->detach($wangwu); //查看当前指针所在的索引位置 echo "指针索引" . $container->key();//0 echo "<br/>"; //重置存储空间指针 $container->rewind(); //校验当前指针是否有效 var_dump($container->valid());//true //遍历存储空间 echo "<pre>"; while ($container->valid()) { //获取当前指针位置的对象 var_dump($container->current()); //存储空间指针下移 $container->next(); } ``` ## **例子2** ~~~ /假设有三个Collection对象 $collection1 = new Supor\Collection(['a' => 'aa', 'b' => 'bb']); $collection2 = new Supor\Collection(['c' => 'cc', 'd' => 'dd']); $collection3 = new Supor\Collection(['e' => 'ee', 'f' => 'ff']); $splStorage = new SplObjectStorage(); $splStorage->attach($collection1); //传入相同的对象会被替代 $splStorage->attach($collection1); $splStorage->attach($collection2); $splStorage->attach($collection3); //统计$splStorage中有多少个对象 $count = $splStorage->count(); var_dump($count); //得到某一对象的哈希值 $hash1 = $splStorage->getHash($collection1); var_dump($hash1); //检查存储中是否包含$collection3 $contains3 = $splStorage->contains($collection3); var_dump($contains3); //将指针后移 $splStorage->next(); //读取移动后的key $key = $splStorage->key(); var_dump($key); //删除某个对象 $splStorage->detach($collection3); //统计删除后的数量 $count = $splStorage->count(); var_dump($count); //遍历$splStorage所有对象 //遍历前先重置一下指针 $splStorage->rewind(); //当当前迭代器条目返回真时 while ($splStorage->valid()) { //打印当前条目 var_dump($splStorage->current()); //指针后移 $splStorage->next(); } ~~~