Changeset 59141 for trunk/src/wp-includes/SimplePie/src/Registry.php
- Timestamp:
- 09/30/2024 10:48:16 PM (7 months ago)
- Location:
- trunk/src/wp-includes/SimplePie/src
- Files:
-
- 1 added
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/wp-includes/SimplePie/src/Registry.php
r59140 r59141 1 1 <?php 2 2 3 /** 3 4 * SimplePie … … 6 7 * Takes the hard work out of managing a complete RSS/Atom solution. 7 8 * 8 * Copyright (c) 2004-20 16, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors9 * Copyright (c) 2004-2022, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors 9 10 * All rights reserved. 10 11 * … … 42 43 */ 43 44 45 namespace SimplePie; 46 47 use SimplePie\Content\Type\Sniffer; 48 use SimplePie\Parse\Date; 49 use SimplePie\XML\Declaration\Parser as DeclarationParser; 50 44 51 /** 45 52 * Handles creating objects and calling methods 46 53 * 47 * Access this via {@see SimplePie::get_registry()}54 * Access this via {@see \SimplePie\SimplePie::get_registry()} 48 55 * 49 56 * @package SimplePie 50 57 */ 51 class SimplePie_Registry58 class Registry 52 59 { 53 /** 54 * Default class mapping 55 * 56 * Overriding classes *must* subclass these. 57 * 58 * @var array 59 */ 60 protected $default = array( 61 'Cache' => 'SimplePie_Cache', 62 'Locator' => 'SimplePie_Locator', 63 'Parser' => 'SimplePie_Parser', 64 'File' => 'SimplePie_File', 65 'Sanitize' => 'SimplePie_Sanitize', 66 'Item' => 'SimplePie_Item', 67 'Author' => 'SimplePie_Author', 68 'Category' => 'SimplePie_Category', 69 'Enclosure' => 'SimplePie_Enclosure', 70 'Caption' => 'SimplePie_Caption', 71 'Copyright' => 'SimplePie_Copyright', 72 'Credit' => 'SimplePie_Credit', 73 'Rating' => 'SimplePie_Rating', 74 'Restriction' => 'SimplePie_Restriction', 75 'Content_Type_Sniffer' => 'SimplePie_Content_Type_Sniffer', 76 'Source' => 'SimplePie_Source', 77 'Misc' => 'SimplePie_Misc', 78 'XML_Declaration_Parser' => 'SimplePie_XML_Declaration_Parser', 79 'Parse_Date' => 'SimplePie_Parse_Date', 80 ); 81 82 /** 83 * Class mapping 84 * 85 * @see register() 86 * @var array 87 */ 88 protected $classes = array(); 89 90 /** 91 * Legacy classes 92 * 93 * @see register() 94 * @var array 95 */ 96 protected $legacy = array(); 97 98 /** 99 * Constructor 100 * 101 * No-op 102 */ 103 public function __construct() { } 104 105 /** 106 * Register a class 107 * 108 * @param string $type See {@see $default} for names 109 * @param string $class Class name, must subclass the corresponding default 110 * @param bool $legacy Whether to enable legacy support for this class 111 * @return bool Successfulness 112 */ 113 public function register($type, $class, $legacy = false) 114 { 115 if (!@is_subclass_of($class, $this->default[$type])) 116 { 117 return false; 118 } 119 120 $this->classes[$type] = $class; 121 122 if ($legacy) 123 { 124 $this->legacy[] = $class; 125 } 126 127 return true; 128 } 129 130 /** 131 * Get the class registered for a type 132 * 133 * Where possible, use {@see create()} or {@see call()} instead 134 * 135 * @param string $type 136 * @return string|null 137 */ 138 public function get_class($type) 139 { 140 if (!empty($this->classes[$type])) 141 { 142 return $this->classes[$type]; 143 } 144 if (!empty($this->default[$type])) 145 { 146 return $this->default[$type]; 147 } 148 149 return null; 150 } 151 152 /** 153 * Create a new instance of a given type 154 * 155 * @param string $type 156 * @param array $parameters Parameters to pass to the constructor 157 * @return object Instance of class 158 */ 159 public function &create($type, $parameters = array()) 160 { 161 $class = $this->get_class($type); 162 163 if (in_array($class, $this->legacy)) 164 { 165 switch ($type) 166 { 167 case 'locator': 168 // Legacy: file, timeout, useragent, file_class, max_checked_feeds, content_type_sniffer_class 169 // Specified: file, timeout, useragent, max_checked_feeds 170 $replacement = array($this->get_class('file'), $parameters[3], $this->get_class('content_type_sniffer')); 171 array_splice($parameters, 3, 1, $replacement); 172 break; 173 } 174 } 175 176 if (!method_exists($class, '__construct')) 177 { 178 $instance = new $class; 179 } 180 else 181 { 182 $reflector = new ReflectionClass($class); 183 $instance = $reflector->newInstanceArgs($parameters); 184 } 185 186 if (method_exists($instance, 'set_registry')) 187 { 188 $instance->set_registry($this); 189 } 190 return $instance; 191 } 192 193 /** 194 * Call a static method for a type 195 * 196 * @param string $type 197 * @param string $method 198 * @param array $parameters 199 * @return mixed 200 */ 201 public function &call($type, $method, $parameters = array()) 202 { 203 $class = $this->get_class($type); 204 205 if (in_array($class, $this->legacy)) 206 { 207 switch ($type) 208 { 209 case 'Cache': 210 // For backwards compatibility with old non-static 211 // Cache::create() methods in PHP < 8.0. 212 // No longer supported as of PHP 8.0. 213 if ($method === 'get_handler') 214 { 215 $result = @call_user_func_array(array($class, 'create'), $parameters); 216 return $result; 217 } 218 break; 219 } 220 } 221 222 $result = call_user_func_array(array($class, $method), $parameters); 223 return $result; 224 } 60 /** 61 * Default class mapping 62 * 63 * Overriding classes *must* subclass these. 64 * 65 * @var array<class-string, class-string> 66 */ 67 protected $default = [ 68 Cache::class => Cache::class, 69 Locator::class => Locator::class, 70 Parser::class => Parser::class, 71 File::class => File::class, 72 Sanitize::class => Sanitize::class, 73 Item::class => Item::class, 74 Author::class => Author::class, 75 Category::class => Category::class, 76 Enclosure::class => Enclosure::class, 77 Caption::class => Caption::class, 78 Copyright::class => Copyright::class, 79 Credit::class => Credit::class, 80 Rating::class => Rating::class, 81 Restriction::class => Restriction::class, 82 Sniffer::class => Sniffer::class, 83 Source::class => Source::class, 84 Misc::class => Misc::class, 85 DeclarationParser::class => DeclarationParser::class, 86 Date::class => Date::class, 87 ]; 88 89 /** 90 * Class mapping 91 * 92 * @see register() 93 * @var array 94 */ 95 protected $classes = []; 96 97 /** 98 * Legacy classes 99 * 100 * @see register() 101 * @var array<class-string> 102 */ 103 protected $legacy = []; 104 105 /** 106 * Legacy types 107 * 108 * @see register() 109 * @var array<string, class-string> 110 */ 111 private $legacyTypes = [ 112 'Cache' => Cache::class, 113 'Locator' => Locator::class, 114 'Parser' => Parser::class, 115 'File' => File::class, 116 'Sanitize' => Sanitize::class, 117 'Item' => Item::class, 118 'Author' => Author::class, 119 'Category' => Category::class, 120 'Enclosure' => Enclosure::class, 121 'Caption' => Caption::class, 122 'Copyright' => Copyright::class, 123 'Credit' => Credit::class, 124 'Rating' => Rating::class, 125 'Restriction' => Restriction::class, 126 'Content_Type_Sniffer' => Sniffer::class, 127 'Source' => Source::class, 128 'Misc' => Misc::class, 129 'XML_Declaration_Parser' => DeclarationParser::class, 130 'Parse_Date' => Date::class, 131 ]; 132 133 /** 134 * Constructor 135 * 136 * No-op 137 */ 138 public function __construct() 139 { 140 } 141 142 /** 143 * Register a class 144 * 145 * @param string $type See {@see $default} for names 146 * @param class-string $class Class name, must subclass the corresponding default 147 * @param bool $legacy Whether to enable legacy support for this class 148 * @return bool Successfulness 149 */ 150 public function register($type, $class, $legacy = false) 151 { 152 if (array_key_exists($type, $this->legacyTypes)) { 153 // trigger_error(sprintf('"%s"(): Using argument #1 ($type) with value "%s" is deprecated since SimplePie 1.8.0, use class-string "%s" instead.', __METHOD__, $type, $this->legacyTypes[$type]), \E_USER_DEPRECATED); 154 155 $type = $this->legacyTypes[$type]; 156 } 157 158 if (!array_key_exists($type, $this->default)) { 159 return false; 160 } 161 162 if (!class_exists($class)) { 163 return false; 164 } 165 166 /** @var string */ 167 $base_class = $this->default[$type]; 168 169 if (!is_subclass_of($class, $base_class)) { 170 return false; 171 } 172 173 $this->classes[$type] = $class; 174 175 if ($legacy) { 176 $this->legacy[] = $class; 177 } 178 179 return true; 180 } 181 182 /** 183 * Get the class registered for a type 184 * 185 * Where possible, use {@see create()} or {@see call()} instead 186 * 187 * @template T 188 * @param class-string<T> $type 189 * @return class-string<T>|null 190 */ 191 public function get_class($type) 192 { 193 if (array_key_exists($type, $this->legacyTypes)) { 194 // trigger_error(sprintf('"%s"(): Using argument #1 ($type) with value "%s" is deprecated since SimplePie 1.8.0, use class-string "%s" instead.', __METHOD__, $type, $this->legacyTypes[$type]), \E_USER_DEPRECATED); 195 196 $type = $this->legacyTypes[$type]; 197 } 198 199 if (!array_key_exists($type, $this->default)) { 200 return null; 201 } 202 203 $class = $this->default[$type]; 204 205 if (array_key_exists($type, $this->classes)) { 206 $class = $this->classes[$type]; 207 } 208 209 return $class; 210 } 211 212 /** 213 * Create a new instance of a given type 214 * 215 * @template T class-string $type 216 * @param class-string<T> $type 217 * @param array $parameters Parameters to pass to the constructor 218 * @return T Instance of class 219 */ 220 public function &create($type, $parameters = []) 221 { 222 $class = $this->get_class($type); 223 224 if (!method_exists($class, '__construct')) { 225 $instance = new $class(); 226 } else { 227 $reflector = new \ReflectionClass($class); 228 $instance = $reflector->newInstanceArgs($parameters); 229 } 230 231 if ($instance instanceof RegistryAware) { 232 $instance->set_registry($this); 233 } elseif (method_exists($instance, 'set_registry')) { 234 trigger_error(sprintf('Using the method "set_registry()" without implementing "%s" is deprecated since SimplePie 1.8.0, implement "%s" in "%s".', RegistryAware::class, RegistryAware::class, $class), \E_USER_DEPRECATED); 235 $instance->set_registry($this); 236 } 237 return $instance; 238 } 239 240 /** 241 * Call a static method for a type 242 * 243 * @param class-string $type 244 * @param string $method 245 * @param array $parameters 246 * @return mixed 247 */ 248 public function &call($type, $method, $parameters = []) 249 { 250 $class = $this->get_class($type); 251 252 if (in_array($class, $this->legacy)) { 253 switch ($type) { 254 case Cache::class: 255 // For backwards compatibility with old non-static 256 // Cache::create() methods in PHP < 8.0. 257 // No longer supported as of PHP 8.0. 258 if ($method === 'get_handler') { 259 $result = @call_user_func_array([$class, 'create'], $parameters); 260 return $result; 261 } 262 break; 263 } 264 } 265 266 $result = call_user_func_array([$class, $method], $parameters); 267 return $result; 268 } 225 269 } 270 271 class_alias('SimplePie\Registry', 'SimplePie_Registry');
Note: See TracChangeset
for help on using the changeset viewer.