xref: /PHP-8.3/ext/spl/tests/iterator_003.phpt (revision 75a678a7)
1--TEST--
2SPL: CachingIterator and __toString()
3--FILE--
4<?php
5
6class Student
7{
8    private $id;
9    private $name;
10
11    public function __construct($id, $name)
12    {
13        $this->id = $id;
14        $this->name = $name;
15    }
16
17    public function __toString()
18    {
19        return $this->id . ', ' . $this->name;
20    }
21
22    public function getId()
23    {
24        return $this->id;
25    }
26}
27
28class StudentIdFilter extends FilterIterator
29{
30    private $id;
31
32    public function __construct(ArrayObject $students, Student $other)
33    {
34        FilterIterator::__construct($students->getIterator());
35        $this->id = $other->getId();
36    }
37
38    public function accept(): bool
39    {
40        echo "ACCEPT ".$this->current()->getId()." == ".$this->id."\n";
41        return $this->current()->getId() == $this->id;
42    }
43}
44
45class StudentList implements IteratorAggregate
46{
47    private $students;
48
49    public function __construct()
50    {
51        $this->students = new ArrayObject(array());
52    }
53
54    public function add(Student $student)
55    {
56        if (!$this->contains($student)) {
57            $this->students[] = $student;
58        }
59    }
60
61    public function contains(Student $student)
62    {
63        foreach ($this->students as $s)
64        {
65            if ($s->getId() == $student->getId()) {
66                return true;
67            }
68        }
69        return false;
70    }
71
72    public function getIterator(): Traversable {
73        return new CachingIterator($this->students->getIterator(), true);
74    }
75}
76
77$students = new StudentList();
78$students->add(new Student('01234123', 'Joe'));
79$students->add(new Student('00000014', 'Bob'));
80$students->add(new Student('00000014', 'Foo'));
81
82// The goal is to verify we can access the cached string value even if it was
83// generated by a call to __toString(). To check this we need to access the
84// iterator's __toString() method.
85$it = $students->getIterator();
86foreach ($it as $student) {
87    echo $it->__toString(), "\n";
88}
89?>
90--EXPECT--
9101234123, Joe
9200000014, Bob
93