225 lines
5.8 KiB
PHP
225 lines
5.8 KiB
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
|
||
|
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;
|
||
|
}
|
||
|
}
|