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