Make WordPress Core

Ticket #18322: WP_Request.php

File WP_Request.php, 3.2 KB (added by dd32, 15 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});