1 | <?php |
---|
2 | |
---|
3 | class WP_Request extends ArrayObject { |
---|
4 | public function __construct($storage = array(), $slashed = 'slashed') { |
---|
5 | parent::setFlags(parent::ARRAY_AS_PROPS); |
---|
6 | $this->load($storage, $slashed); |
---|
7 | } |
---|
8 | private function populate_props($array = null) { |
---|
9 | if ( empty($array) ) |
---|
10 | $array =& static::$storage; |
---|
11 | foreach ( $array as $key => $value ) |
---|
12 | $this->$key = $value; |
---|
13 | } |
---|
14 | public function load($storage, $slashed = 'slashed') { |
---|
15 | if ( 'slashed' == $slashed ) |
---|
16 | $storage = stripslashes_deep($storage); |
---|
17 | self::set($storage); |
---|
18 | } |
---|
19 | public function set($key, $value = null) { |
---|
20 | if ( is_scalar($key) && is_null($value) ) { |
---|
21 | unset( static::$storage[ $key ] ); |
---|
22 | if ( isset($this->$key) ) |
---|
23 | unset($this->$key); |
---|
24 | return true; |
---|
25 | } |
---|
26 | |
---|
27 | if ( is_scalar($key) ) |
---|
28 | $key = array( $key => $value ); |
---|
29 | static::$storage = array_merge( static::$storage, $key); |
---|
30 | if ( isset($this) ) |
---|
31 | self::populate_props($key); |
---|
32 | return true; |
---|
33 | } |
---|
34 | public function get($key, $default = null) { |
---|
35 | if ( is_array($key) ) { |
---|
36 | $_result = array(); |
---|
37 | foreach ( $key as $k ) |
---|
38 | $_result[ $k ] = self::get($k, isset($default[$k]) ? $default[$k] : null ); |
---|
39 | return $_result; |
---|
40 | } |
---|
41 | if ( isset(static::$storage[ $key ]) ) |
---|
42 | return static::$storage[ $key ]; |
---|
43 | return $default; |
---|
44 | } |
---|
45 | public function __get($key) { |
---|
46 | return self::get($key); |
---|
47 | } |
---|
48 | public function __set($key, $value) { |
---|
49 | return self::set($key, $value); |
---|
50 | } |
---|
51 | public function __isset($key) { |
---|
52 | return isset(static::$storage[$key]); |
---|
53 | } |
---|
54 | public function __unset($key) { |
---|
55 | return self::set($key, null); |
---|
56 | } |
---|
57 | |
---|
58 | |
---|
59 | } |
---|
60 | |
---|
61 | // Seperate classes for static class access and individual $storage |
---|
62 | class GET extends WP_Request { |
---|
63 | static $storage = array(); |
---|
64 | } |
---|
65 | class POST extends WP_Request { |
---|
66 | static $storage = array(); |
---|
67 | } |
---|
68 | class REQUEST extends WP_Request { |
---|
69 | static $storage = array(); |
---|
70 | } |
---|
71 | |
---|
72 | GET::load($_GET, 'slashed'); |
---|
73 | POST::load($_POST, 'slashed'); |
---|
74 | REQUEST::load($_REQUEST, 'slashed'); |
---|
75 | |
---|
76 | add_action('template_redirect', function() { |
---|
77 | // Lets assume ?key=GET1&key3=>GET3 is used |
---|
78 | |
---|
79 | var_dump( GET::get('key', 'default') ); // GET1 |
---|
80 | var_dump( GET::get('key2', 'default') ); // default |
---|
81 | var_dump( POST::get('key', 'default') ); // default |
---|
82 | var_dump( GET::get( array('key', 'key2') ) ); // key2 |
---|
83 | |
---|
84 | $g = new GET(); |
---|
85 | var_dump( |
---|
86 | $g->get('key'), // Works |
---|
87 | $g->key, // Works |
---|
88 | $g['key'] // Works |
---|
89 | ); |
---|
90 | var_dump( |
---|
91 | $g->get('key2'), // Works, returns null |
---|
92 | $g->key2, // Notices undefined |
---|
93 | $g['key2'] // Notices undefined |
---|
94 | ); |
---|
95 | var_dump( (array)$g ); // Array of unslashed data |
---|
96 | |
---|
97 | var_dump( GET::get( array('key', 'key2', 'key3', 'key4' ), array( 'key4' => 'VAL4') ) ); |
---|
98 | /* returns: |
---|
99 | array |
---|
100 | 'key' => string 'GET' (length=3) |
---|
101 | 'key2' => null // It's unset |
---|
102 | 'key3' => string 'GET3' (length=4) |
---|
103 | 'key4' => string 'VAL4' (length=4) //From the defaults |
---|
104 | */ |
---|
105 | |
---|
106 | // Iterates over unslashed data |
---|
107 | foreach ( $g as $key => $value ) |
---|
108 | var_dump( "$key => $value" ); |
---|
109 | |
---|
110 | $g->set('test', '123'); // set ?$query&test=123 |
---|
111 | var_dump(GET::get('test')); // Works: 123 |
---|
112 | var_dump(REQUEST::get('test')); // Works: Returns null - GET/POST doesnt affect REQUEST after it's initialized. |
---|
113 | var_dump($_GET['test']); // Notices: Unset, class doesn't fill affect SuperGlobals yet. |
---|
114 | |
---|
115 | }); |
---|