| 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 | }); |
|---|