Seditio Source
Root |
./othercms/wordpress-6.0/wp-includes/SimplePie/Registry.php
<?php
/**
 * SimplePie
 *
 * A PHP-Based RSS and Atom Feed Framework.
 * Takes the hard work out of managing a complete RSS/Atom solution.
 *
 * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 *     * Redistributions of source code must retain the above copyright notice, this list of
 *       conditions and the following disclaimer.
 *
 *     * Redistributions in binary form must reproduce the above copyright notice, this list
 *       of conditions and the following disclaimer in the documentation and/or other materials
 *       provided with the distribution.
 *
 *     * Neither the name of the SimplePie Team nor the names of its contributors may be used
 *       to endorse or promote products derived from this software without specific prior
 *       written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * @package SimplePie
 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
 * @author Ryan Parman
 * @author Sam Sneddon
 * @author Ryan McCue
 * @link http://simplepie.org/ SimplePie
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 */

/**
 * Handles creating objects and calling methods
 *
 * Access this via {@see SimplePie::get_registry()}
 *
 * @package SimplePie
 */
class SimplePie_Registry
{
   
/**
     * Default class mapping
     *
     * Overriding classes *must* subclass these.
     *
     * @var array
     */
   
protected $default = array(
       
'Cache' => 'SimplePie_Cache',
       
'Locator' => 'SimplePie_Locator',
       
'Parser' => 'SimplePie_Parser',
       
'File' => 'SimplePie_File',
       
'Sanitize' => 'SimplePie_Sanitize',
       
'Item' => 'SimplePie_Item',
       
'Author' => 'SimplePie_Author',
       
'Category' => 'SimplePie_Category',
       
'Enclosure' => 'SimplePie_Enclosure',
       
'Caption' => 'SimplePie_Caption',
       
'Copyright' => 'SimplePie_Copyright',
       
'Credit' => 'SimplePie_Credit',
       
'Rating' => 'SimplePie_Rating',
       
'Restriction' => 'SimplePie_Restriction',
       
'Content_Type_Sniffer' => 'SimplePie_Content_Type_Sniffer',
       
'Source' => 'SimplePie_Source',
       
'Misc' => 'SimplePie_Misc',
       
'XML_Declaration_Parser' => 'SimplePie_XML_Declaration_Parser',
       
'Parse_Date' => 'SimplePie_Parse_Date',
    );

   
/**
     * Class mapping
     *
     * @see register()
     * @var array
     */
   
protected $classes = array();

   
/**
     * Legacy classes
     *
     * @see register()
     * @var array
     */
   
protected $legacy = array();

   
/**
     * Constructor
     *
     * No-op
     */
   
public function __construct() { }

   
/**
     * Register a class
     *
     * @param string $type See {@see $default} for names
     * @param string $class Class name, must subclass the corresponding default
     * @param bool $legacy Whether to enable legacy support for this class
     * @return bool Successfulness
     */
   
public function register($type, $class, $legacy = false)
    {
        if (!@
is_subclass_of($class, $this->default[$type]))
        {
            return
false;
        }

       
$this->classes[$type] = $class;

        if (
$legacy)
        {
           
$this->legacy[] = $class;
        }

        return
true;
    }

   
/**
     * Get the class registered for a type
     *
     * Where possible, use {@see create()} or {@see call()} instead
     *
     * @param string $type
     * @return string|null
     */
   
public function get_class($type)
    {
        if (!empty(
$this->classes[$type]))
        {
            return
$this->classes[$type];
        }
        if (!empty(
$this->default[$type]))
        {
            return
$this->default[$type];
        }

        return
null;
    }

   
/**
     * Create a new instance of a given type
     *
     * @param string $type
     * @param array $parameters Parameters to pass to the constructor
     * @return object Instance of class
     */
   
public function &create($type, $parameters = array())
    {
       
$class = $this->get_class($type);

        if (
in_array($class, $this->legacy))
        {
            switch (
$type)
            {
                case
'locator':
                   
// Legacy: file, timeout, useragent, file_class, max_checked_feeds, content_type_sniffer_class
                    // Specified: file, timeout, useragent, max_checked_feeds
                   
$replacement = array($this->get_class('file'), $parameters[3], $this->get_class('content_type_sniffer'));
                   
array_splice($parameters, 3, 1, $replacement);
                    break;
            }
        }

        if (!
method_exists($class, '__construct'))
        {
           
$instance = new $class;
        }
        else
        {
           
$reflector = new ReflectionClass($class);
           
$instance = $reflector->newInstanceArgs($parameters);
        }

        if (
method_exists($instance, 'set_registry'))
        {
           
$instance->set_registry($this);
        }
        return
$instance;
    }

   
/**
     * Call a static method for a type
     *
     * @param string $type
     * @param string $method
     * @param array $parameters
     * @return mixed
     */
   
public function &call($type, $method, $parameters = array())
    {
       
$class = $this->get_class($type);

        if (
in_array($class, $this->legacy))
        {
            switch (
$type)
            {
                case
'Cache':
                   
// For backwards compatibility with old non-static
                    // Cache::create() methods in PHP < 8.0.
                    // No longer supported as of PHP 8.0.
                   
if ($method === 'get_handler')
                    {
                       
$result = @call_user_func_array(array($class, 'create'), $parameters);
                        return
$result;
                    }
                    break;
            }
        }

       
$result = call_user_func_array(array($class, $method), $parameters);
        return
$result;
    }
}