1: <?php
2: /**
3: * CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
4: * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
5: *
6: * Licensed under The MIT License
7: * For full copyright and license information, please see the LICENSE.txt
8: * Redistributions of files must retain the above copyright notice.
9: *
10: * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
11: * @link https://cakephp.org CakePHP(tm) Project
12: * @since 3.0.0
13: * @license https://opensource.org/licenses/mit-license.php MIT License
14: */
15: namespace Cake\Collection;
16:
17: use ArrayIterator;
18: use InvalidArgumentException;
19: use IteratorIterator;
20: use Serializable;
21: use Traversable;
22:
23: /**
24: * A collection is an immutable list of elements with a handful of functions to
25: * iterate, group, transform and extract information from it.
26: */
27: class Collection extends IteratorIterator implements CollectionInterface, Serializable
28: {
29: use CollectionTrait;
30:
31: /**
32: * Constructor. You can provide an array or any traversable object
33: *
34: * @param array|\Traversable $items Items.
35: * @throws \InvalidArgumentException If passed incorrect type for items.
36: */
37: public function __construct($items)
38: {
39: if (is_array($items)) {
40: $items = new ArrayIterator($items);
41: }
42:
43: if (!($items instanceof Traversable)) {
44: $msg = 'Only an array or \Traversable is allowed for Collection';
45: throw new InvalidArgumentException($msg);
46: }
47:
48: parent::__construct($items);
49: }
50:
51: /**
52: * Returns a string representation of this object that can be used
53: * to reconstruct it
54: *
55: * @return string
56: */
57: public function serialize()
58: {
59: return serialize($this->buffered());
60: }
61:
62: /**
63: * Unserializes the passed string and rebuilds the Collection instance
64: *
65: * @param string $collection The serialized collection
66: * @return void
67: */
68: public function unserialize($collection)
69: {
70: $this->__construct(unserialize($collection));
71: }
72:
73: /**
74: * {@inheritDoc}
75: *
76: * @return int
77: */
78: public function count()
79: {
80: $traversable = $this->optimizeUnwrap();
81:
82: if (is_array($traversable)) {
83: return count($traversable);
84: }
85:
86: return iterator_count($traversable);
87: }
88:
89: /**
90: * {@inheritDoc}
91: *
92: * @return int
93: */
94: public function countKeys()
95: {
96: return count($this->toArray());
97: }
98:
99: /**
100: * Returns an array that can be used to describe the internal state of this
101: * object.
102: *
103: * @return array
104: */
105: public function __debugInfo()
106: {
107: return [
108: 'count' => $this->count(),
109: ];
110: }
111: }
112: