Merge pull request #6126 from rohankatkar/CRM-16777
[civicrm-core.git] / CRM / Utils / OptionBag.php
1 <?php
2
3 /**
4 * Class CRM_Utils_OptionBag
5 */
6 class CRM_Utils_OptionBag implements ArrayAccess, IteratorAggregate, Countable {
7 protected $data;
8
9 /**
10 * @param array $data
11 */
12 public function __construct($data = array()) {
13 $this->data = $data;
14 }
15
16 /**
17 * @return array
18 */
19 public function getArray() {
20 return $this->data;
21 }
22
23 /**
24 * Retrieve a value from the bag.
25 *
26 * @param string $key
27 * @param string|null $type
28 * @param mixed $default
29 * @return mixed
30 * @throws API_Exception
31 */
32 public function get($key, $type = NULL, $default = NULL) {
33 if (!array_key_exists($key, $this->data)) {
34 return $default;
35 }
36 if (!$type) {
37 return $this->data[$key];
38 }
39 $r = CRM_Utils_Type::validate($this->data[$key], $type);
40 if ($r !== NULL) {
41 return $r;
42 }
43 else {
44 throw new \API_Exception(ts("Could not find valid value for %1 (%2)", array(1 => $key, 2 => $type)));
45 }
46 }
47
48 /**
49 * @param $key
50 *
51 * @return bool
52 */
53 public function has($key) {
54 return isset($this->data[$key]);
55 }
56
57 /**
58 * (PHP 5 &gt;= 5.0.0)<br/>
59 * Whether a offset exists
60 * @link http://php.net/manual/en/arrayaccess.offsetexists.php
61 * @param mixed $offset
62 * <p>.
63 * An offset to check for.
64 * </p>
65 * @return bool
66 * true on success or false on failure.
67 * </p>
68 * <p>
69 * The return value will be casted to boolean if non-boolean was returned.
70 */
71 public function offsetExists($offset) {
72 return array_key_exists($offset, $this->data);
73 }
74
75 /**
76 * (PHP 5 &gt;= 5.0.0)<br/>
77 * Offset to retrieve
78 * @link http://php.net/manual/en/arrayaccess.offsetget.php
79 * @param mixed $offset
80 * <p>.
81 * The offset to retrieve.
82 * </p>
83 * @return mixed
84 * Can return all value types.
85 */
86 public function offsetGet($offset) {
87 return $this->data[$offset];
88 }
89
90 /**
91 * (PHP 5 &gt;= 5.0.0)<br/>
92 * Offset to set
93 * @link http://php.net/manual/en/arrayaccess.offsetset.php
94 * @param mixed $offset
95 * <p>.
96 * The offset to assign the value to.
97 * </p>
98 * @param mixed $value
99 * <p>.
100 * The value to set.
101 * </p>
102 * @return void
103 */
104 public function offsetSet($offset, $value) {
105 $this->data[$offset] = $value;
106 }
107
108 /**
109 * (PHP 5 &gt;= 5.0.0)<br/>
110 * Offset to unset
111 * @link http://php.net/manual/en/arrayaccess.offsetunset.php
112 * @param mixed $offset
113 * <p>.
114 * The offset to unset.
115 * </p>
116 * @return void
117 */
118 public function offsetUnset($offset) {
119 unset($this->data[$offset]);
120 }
121
122 /**
123 * (PHP 5 &gt;= 5.0.0)<br/>
124 * Retrieve an external iterator
125 * @link http://php.net/manual/en/iteratoraggregate.getiterator.php
126 * @return Traversable
127 * An instance of an object implementing <b>Iterator</b> or
128 * <b>Traversable</b>
129 */
130 public function getIterator() {
131 return new ArrayIterator($this->data);
132 }
133
134 /**
135 * (PHP 5 &gt;= 5.1.0)<br/>
136 * Count elements of an object
137 * @link http://php.net/manual/en/countable.count.php
138 * @return int
139 * The custom count as an integer.
140 * </p>
141 * <p>
142 * The return value is cast to an integer.
143 */
144 public function count() {
145 return count($this->data);
146 }
147
148 }