4 * Encapsulates access to the $_REQUEST array, making sure used parameters are initialized and
5 * have the correct type.
7 * All function access the $_REQUEST array by default, if you want to access $_POST or $_GET
8 * explicitly use the $post and $get members.
10 * @author Andreas Gohr <andi@splitbrain.org>
14 /** @var PostInput Access $_POST parameters */
16 /** @var GetInput Access $_GET parameters */
22 * Intilizes the Input class and it subcomponents
24 function __construct() {
25 $this->access = &$_REQUEST;
26 $this->post = new PostInput();
27 $this->get = new GetInput();
31 * Check if a parameter was set
33 * Basically a wrapper around isset. When called on the $post and $get subclasses,
34 * the parameter is set to $_POST or $_GET and to $_REQUEST
37 * @param string $name Parameter name
40 public function has($name) {
41 return isset($this->access[$name]);
45 * Remove a parameter from the superglobals
47 * Basically a wrapper around unset. When NOT called on the $post and $get subclasses,
48 * the parameter will also be removed from $_POST or $_GET
51 * @param string $name Parameter name
54 public function remove($name) {
55 if(isset($this->access[$name])) {
56 unset($this->access[$name]);
58 // also remove from sub classes
59 if(isset($this->post) && isset($_POST[$name])) {
62 if(isset($this->get) && isset($_GET[$name])) {
68 * Access a request parameter without any type conversion
70 * @param string $name Parameter name
71 * @param mixed $default Default to return if parameter isn't set
72 * @param bool $nonempty Return $default if parameter is set but empty()
75 public function param($name, $default = null, $nonempty = false) {
76 if(!isset($this->access[$name])) return $default;
77 if($nonempty && empty($this->access[$name])) return $default;
78 return $this->access[$name];
84 * @param string $name Parameter name
85 * @param mixed $value Value to set
87 public function set($name, $value) {
88 $this->access[$name] = $value;
92 * Get a reference to a request parameter
94 * This avoids copying data in memory, when the parameter is not set it will be created
95 * and intialized with the given $default value before a reference is returned
97 * @param string $name Parameter name
98 * @param mixed $default If parameter is not set, initialize with this value
99 * @param bool $nonempty Init with $default if parameter is set but empty()
102 public function &ref($name, $default = '', $nonempty = false) {
103 if(!isset($this->access[$name]) || ($nonempty && empty($this->access[$name]))) {
104 $this->set($name, $default);
107 return $this->access[$name];
111 * Access a request parameter as int
113 * @param string $name Parameter name
114 * @param mixed $default Default to return if parameter isn't set or is an array
115 * @param bool $nonempty Return $default if parameter is set but empty()
118 public function int($name, $default = 0, $nonempty = false) {
119 if(!isset($this->access[$name])) return $default;
120 if(is_array($this->access[$name])) return $default;
121 if($this->access[$name] === '') return $default;
122 if($nonempty && empty($this->access[$name])) return $default;
124 return (int) $this->access[$name];
128 * Access a request parameter as string
130 * @param string $name Parameter name
131 * @param mixed $default Default to return if parameter isn't set or is an array
132 * @param bool $nonempty Return $default if parameter is set but empty()
135 public function str($name, $default = '', $nonempty = false) {
136 if(!isset($this->access[$name])) return $default;
137 if(is_array($this->access[$name])) return $default;
138 if($nonempty && empty($this->access[$name])) return $default;
140 return (string) $this->access[$name];
144 * Access a request parameter as bool
146 * Note: $nonempty is here for interface consistency and makes not much sense for booleans
148 * @param string $name Parameter name
149 * @param mixed $default Default to return if parameter isn't set
150 * @param bool $nonempty Return $default if parameter is set but empty()
153 public function bool($name, $default = false, $nonempty = false) {
154 if(!isset($this->access[$name])) return $default;
155 if(is_array($this->access[$name])) return $default;
156 if($this->access[$name] === '') return $default;
157 if($nonempty && empty($this->access[$name])) return $default;
159 return (bool) $this->access[$name];
163 * Access a request parameter as array
165 * @param string $name Parameter name
166 * @param mixed $default Default to return if parameter isn't set
167 * @param bool $nonempty Return $default if parameter is set but empty()
170 public function arr($name, $default = array(), $nonempty = false) {
171 if(!isset($this->access[$name])) return $default;
172 if(!is_array($this->access[$name])) return $default;
173 if($nonempty && empty($this->access[$name])) return $default;
175 return (array) $this->access[$name];
179 * Create a simple key from an array key
181 * This is useful to access keys where the information is given as an array key or as a single array value.
182 * For example when the information was submitted as the name of a submit button.
184 * This function directly changes the access array.
186 * Eg. $_REQUEST['do']['save']='Speichern' becomes $_REQUEST['do'] = 'save'
188 * This function returns the $INPUT object itself for easy chaining
193 public function extract($name){
194 if(!isset($this->access[$name])) return $this;
195 if(!is_array($this->access[$name])) return $this;
196 $keys = array_keys($this->access[$name]);
198 // this was an empty array
199 $this->remove($name);
203 $value = array_shift($keys);
205 // we had a numeric array, assume the value is not in the key
206 $value = array_shift($this->access[$name]);
209 $this->set($name, $value);
215 * Internal class used for $_POST access in Input class
217 class PostInput extends Input {
221 * Initialize the $access array, remove subclass members
223 function __construct() {
224 $this->access = &$_POST;
228 * Sets a parameter in $_POST and $_REQUEST
230 * @param string $name Parameter name
231 * @param mixed $value Value to set
233 public function set($name, $value) {
234 parent::set($name, $value);
235 $_REQUEST[$name] = $value;
240 * Internal class used for $_GET access in Input class
243 class GetInput extends Input {
247 * Initialize the $access array, remove subclass members
249 function __construct() {
250 $this->access = &$_GET;
254 * Sets a parameter in $_GET and $_REQUEST
256 * @param string $name Parameter name
257 * @param mixed $value Value to set
259 public function set($name, $value) {
260 parent::set($name, $value);
261 $_REQUEST[$name] = $value;