WordPress.org

Make WordPress Core

Ticket #18322: WP_Request.php

File WP_Request.php, 3.2 KB (added by dd32, 9 years ago)
Line 
1<?php
2
3class 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
62class GET extends WP_Request {
63        static $storage = array();
64}
65class POST extends WP_Request {
66        static $storage = array();
67}
68class REQUEST extends WP_Request {
69        static $storage = array();
70}
71
72GET::load($_GET, 'slashed');
73POST::load($_POST, 'slashed');
74REQUEST::load($_REQUEST, 'slashed');
75
76add_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});