import v1.1.0_beta1 | 2009-08-21
This commit is contained in:
464
libs/Zend/Loader/Autoloader.php
Normal file
464
libs/Zend/Loader/Autoloader.php
Normal file
@ -0,0 +1,464 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@zend.com so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Loader
|
||||
* @subpackage Autoloader
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @version $Id: Autoloader.php 16029 2009-06-12 18:01:37Z doctorrock83 $
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/** Zend_Loader */
|
||||
require_once 'Zend/Loader.php';
|
||||
|
||||
/**
|
||||
* Autoloader stack and namespace autoloader
|
||||
*
|
||||
* @uses Zend_Loader_Autoloader
|
||||
* @package Zend_Loader
|
||||
* @subpackage Autoloader
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license New BSD {@link http://framework.zend.com/license/new-bsd}
|
||||
*/
|
||||
class Zend_Loader_Autoloader
|
||||
{
|
||||
/**
|
||||
* @var Zend_Loader_Autoloader Singleton instance
|
||||
*/
|
||||
protected static $_instance;
|
||||
|
||||
/**
|
||||
* @var array Concrete autoloader callback implementations
|
||||
*/
|
||||
protected $_autoloaders = array();
|
||||
|
||||
/**
|
||||
* @var array Default autoloader callback
|
||||
*/
|
||||
protected $_defaultAutoloader = array('Zend_Loader', 'loadClass');
|
||||
|
||||
/**
|
||||
* @var bool Whether or not to act as a fallback autoloader
|
||||
*/
|
||||
protected $_fallbackAutoloader = false;
|
||||
|
||||
/**
|
||||
* @var array Callback for internal autoloader implementation
|
||||
*/
|
||||
protected $_internalAutoloader;
|
||||
|
||||
/**
|
||||
* @var array Supported namespaces 'Zend' and 'ZendX' by default.
|
||||
*/
|
||||
protected $_namespaces = array(
|
||||
'Zend_' => true,
|
||||
'ZendX_' => true,
|
||||
);
|
||||
|
||||
/**
|
||||
* @var array Namespace-specific autoloaders
|
||||
*/
|
||||
protected $_namespaceAutoloaders = array();
|
||||
|
||||
/**
|
||||
* @var bool Whether or not to suppress file not found warnings
|
||||
*/
|
||||
protected $_suppressNotFoundWarnings = false;
|
||||
|
||||
/**
|
||||
* Retrieve singleton instance
|
||||
*
|
||||
* @return Zend_Loader_Autoloader
|
||||
*/
|
||||
public static function getInstance()
|
||||
{
|
||||
if (null === self::$_instance) {
|
||||
self::$_instance = new self();
|
||||
}
|
||||
return self::$_instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset the singleton instance
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public static function resetInstance()
|
||||
{
|
||||
self::$_instance = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Autoload a class
|
||||
*
|
||||
* @param string $class
|
||||
* @return bool
|
||||
*/
|
||||
public static function autoload($class)
|
||||
{
|
||||
$self = self::getInstance();
|
||||
|
||||
foreach ($self->getClassAutoloaders($class) as $autoloader) {
|
||||
if ($autoloader instanceof Zend_Loader_Autoloader_Interface) {
|
||||
if ($autoloader->autoload($class)) {
|
||||
return true;
|
||||
}
|
||||
} elseif (is_string($autoloader)) {
|
||||
if ($autoloader($class)) {
|
||||
return true;
|
||||
}
|
||||
} elseif (is_array($autoloader)) {
|
||||
$object = array_shift($autoloader);
|
||||
$method = array_shift($autoloader);
|
||||
if (call_user_func(array($object, $method), $class)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the default autoloader implementation
|
||||
*
|
||||
* @param string|array $callback PHP callback
|
||||
* @return void
|
||||
*/
|
||||
public function setDefaultAutoloader($callback)
|
||||
{
|
||||
if (!is_callable($callback)) {
|
||||
throw new Zend_Loader_Exception('Invalid callback specified for default autoloader');
|
||||
}
|
||||
|
||||
$this->_defaultAutoloader = $callback;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the default autoloader callback
|
||||
*
|
||||
* @return string|array PHP Callback
|
||||
*/
|
||||
public function getDefaultAutoloader()
|
||||
{
|
||||
return $this->_defaultAutoloader;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set several autoloader callbacks at once
|
||||
*
|
||||
* @param array $autoloaders Array of PHP callbacks (or Zend_Loader_Autoloader_Interface implementations) to act as autoloaders
|
||||
* @return Zend_Loader_Autoloader
|
||||
*/
|
||||
public function setAutoloaders(array $autoloaders)
|
||||
{
|
||||
$this->_autoloaders = $autoloaders;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get attached autoloader implementations
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getAutoloaders()
|
||||
{
|
||||
return $this->_autoloaders;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return all autoloaders for a given namespace
|
||||
*
|
||||
* @param string $namespace
|
||||
* @return array
|
||||
*/
|
||||
public function getNamespaceAutoloaders($namespace)
|
||||
{
|
||||
$namespace = (string) $namespace;
|
||||
if (!array_key_exists($namespace, $this->_namespaceAutoloaders)) {
|
||||
return array();
|
||||
}
|
||||
return $this->_namespaceAutoloaders[$namespace];
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a namespace to autoload
|
||||
*
|
||||
* @param string|array $namespace
|
||||
* @return Zend_Loader_Autoloader
|
||||
*/
|
||||
public function registerNamespace($namespace)
|
||||
{
|
||||
if (is_string($namespace)) {
|
||||
$namespace = (array) $namespace;
|
||||
} elseif (!is_array($namespace)) {
|
||||
throw new Zend_Loader_Exception('Invalid namespace provided');
|
||||
}
|
||||
|
||||
foreach ($namespace as $ns) {
|
||||
if (!isset($this->_namespaces[$ns])) {
|
||||
$this->_namespaces[$ns] = true;
|
||||
}
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Unload a registered autoload namespace
|
||||
*
|
||||
* @param string|array $namespace
|
||||
* @return Zend_Loader_Autoloader
|
||||
*/
|
||||
public function unregisterNamespace($namespace)
|
||||
{
|
||||
if (is_string($namespace)) {
|
||||
$namespace = (array) $namespace;
|
||||
} elseif (!is_array($namespace)) {
|
||||
throw new Zend_Loader_Exception('Invalid namespace provided');
|
||||
}
|
||||
|
||||
foreach ($namespace as $ns) {
|
||||
if (isset($this->_namespaces[$ns])) {
|
||||
unset($this->_namespaces[$ns]);
|
||||
}
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a list of registered autoload namespaces
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getRegisteredNamespaces()
|
||||
{
|
||||
return array_keys($this->_namespaces);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get or set the value of the "suppress not found warnings" flag
|
||||
*
|
||||
* @param null|bool $flag
|
||||
* @return bool|Zend_Loader_Autoloader Returns boolean if no argument is passed, object instance otherwise
|
||||
*/
|
||||
public function suppressNotFoundWarnings($flag = null)
|
||||
{
|
||||
if (null === $flag) {
|
||||
return $this->_suppressNotFoundWarnings;
|
||||
}
|
||||
$this->_suppressNotFoundWarnings = (bool) $flag;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Indicate whether or not this autoloader should be a fallback autoloader
|
||||
*
|
||||
* @param bool $flag
|
||||
* @return Zend_Loader_Autoloader
|
||||
*/
|
||||
public function setFallbackAutoloader($flag)
|
||||
{
|
||||
$this->_fallbackAutoloader = (bool) $flag;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Is this instance acting as a fallback autoloader?
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isFallbackAutoloader()
|
||||
{
|
||||
return $this->_fallbackAutoloader;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get autoloaders to use when matching class
|
||||
*
|
||||
* Determines if the class matches a registered namespace, and, if so,
|
||||
* returns only the autoloaders for that namespace. Otherwise, it returns
|
||||
* all non-namespaced autoloaders.
|
||||
*
|
||||
* @param string $class
|
||||
* @return array Array of autoloaders to use
|
||||
*/
|
||||
public function getClassAutoloaders($class)
|
||||
{
|
||||
$namespace = false;
|
||||
$autoloaders = array();
|
||||
|
||||
// Add concrete namespaced autoloaders
|
||||
foreach (array_keys($this->_namespaceAutoloaders) as $ns) {
|
||||
if ('' == $ns) {
|
||||
continue;
|
||||
}
|
||||
if (0 === strpos($class, $ns)) {
|
||||
$namespace = $ns;
|
||||
$autoloaders = $autoloaders + $this->getNamespaceAutoloaders($ns);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Add internal namespaced autoloader
|
||||
foreach ($this->getRegisteredNamespaces() as $ns) {
|
||||
if (0 === strpos($class, $ns)) {
|
||||
$namespace = $ns;
|
||||
$autoloaders[] = $this->_internalAutoloader;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Add non-namespaced autoloaders
|
||||
$autoloaders = $autoloaders + $this->getNamespaceAutoloaders('');
|
||||
|
||||
// Add fallback autoloader
|
||||
if (!$namespace && $this->isFallbackAutoloader()) {
|
||||
$autoloaders[] = $this->_internalAutoloader;
|
||||
}
|
||||
|
||||
return $autoloaders;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an autoloader to the beginning of the stack
|
||||
*
|
||||
* @param object|array|string $callback PHP callback or Zend_Loader_Autoloader_Interface implementation
|
||||
* @param string|array $namespace Specific namespace(s) under which to register callback
|
||||
* @return Zend_Loader_Autoloader
|
||||
*/
|
||||
public function unshiftAutoloader($callback, $namespace = '')
|
||||
{
|
||||
$autoloaders = $this->getAutoloaders();
|
||||
array_unshift($autoloaders, $callback);
|
||||
$this->setAutoloaders($autoloaders);
|
||||
|
||||
$namespace = (array) $namespace;
|
||||
foreach ($namespace as $ns) {
|
||||
$autoloaders = $this->getNamespaceAutoloaders($ns);
|
||||
array_unshift($autoloaders, $callback);
|
||||
$this->_setNamespaceAutoloaders($autoloaders, $ns);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Append an autoloader to the autoloader stack
|
||||
*
|
||||
* @param object|array|string $callback PHP callback or Zend_Loader_Autoloader_Interface implementation
|
||||
* @param string|array $namespace Specific namespace(s) under which to register callback
|
||||
* @return Zend_Loader_Autoloader
|
||||
*/
|
||||
public function pushAutoloader($callback, $namespace = '')
|
||||
{
|
||||
$autoloaders = $this->getAutoloaders();
|
||||
array_push($autoloaders, $callback);
|
||||
$this->setAutoloaders($autoloaders);
|
||||
|
||||
$namespace = (array) $namespace;
|
||||
foreach ($namespace as $ns) {
|
||||
$autoloaders = $this->getNamespaceAutoloaders($ns);
|
||||
array_push($autoloaders, $callback);
|
||||
$this->_setNamespaceAutoloaders($autoloaders, $ns);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove an autoloader from the autoloader stack
|
||||
*
|
||||
* @param object|array|string $callback PHP callback or Zend_Loader_Autoloader_Interface implementation
|
||||
* @param null|string|array $namespace Specific namespace(s) from which to remove autoloader
|
||||
* @return Zend_Loader_Autoloader
|
||||
*/
|
||||
public function removeAutoloader($callback, $namespace = null)
|
||||
{
|
||||
if (null === $namespace) {
|
||||
$autoloaders = $this->getAutoloaders();
|
||||
if (false !== ($index = array_search($callback, $autoloaders, true))) {
|
||||
unset($autoloaders[$index]);
|
||||
$this->setAutoloaders($autoloaders);
|
||||
}
|
||||
|
||||
foreach ($this->_namespaceAutoloaders as $ns => $autoloaders) {
|
||||
if (false !== ($index = array_search($callback, $autoloaders, true))) {
|
||||
unset($autoloaders[$index]);
|
||||
$this->_setNamespaceAutoloaders($autoloaders, $ns);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$namespace = (array) $namespace;
|
||||
foreach ($namespace as $ns) {
|
||||
$autoloaders = $this->getNamespaceAutoloaders($ns);
|
||||
if (false !== ($index = array_search($callback, $autoloaders, true))) {
|
||||
unset($autoloaders[$index]);
|
||||
$this->_setNamespaceAutoloaders($autoloaders, $ns);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* Registers instance with spl_autoload stack
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function __construct()
|
||||
{
|
||||
spl_autoload_register(array(__CLASS__, 'autoload'));
|
||||
$this->_internalAutoloader = array($this, '_autoload');
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal autoloader implementation
|
||||
*
|
||||
* @param string $class
|
||||
* @return bool
|
||||
*/
|
||||
protected function _autoload($class)
|
||||
{
|
||||
$callback = $this->getDefaultAutoloader();
|
||||
try {
|
||||
if ($this->suppressNotFoundWarnings()) {
|
||||
@call_user_func($callback, $class);
|
||||
} else {
|
||||
call_user_func($callback, $class);
|
||||
}
|
||||
return $class;
|
||||
} catch (Zend_Exception $e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set autoloaders for a specific namespace
|
||||
*
|
||||
* @param array $autoloaders
|
||||
* @param string $namespace
|
||||
* @return Zend_Loader_Autoloader
|
||||
*/
|
||||
protected function _setNamespaceAutoloaders(array $autoloaders, $namespace = '')
|
||||
{
|
||||
$namespace = (string) $namespace;
|
||||
$this->_namespaceAutoloaders[$namespace] = $autoloaders;
|
||||
return $this;
|
||||
}
|
||||
}
|
34
libs/Zend/Loader/Autoloader/Interface.php
Normal file
34
libs/Zend/Loader/Autoloader/Interface.php
Normal file
@ -0,0 +1,34 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@zend.com so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Loader
|
||||
* @subpackage Autoloader
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @version $Id: Interface.php 13809 2009-01-27 19:01:54Z matthew $
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/**
|
||||
* Autoloader interface
|
||||
*
|
||||
* @package Zend_Loader
|
||||
* @subpackage Autoloader
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license New BSD {@link http://framework.zend.com/license/new-bsd}
|
||||
*/
|
||||
interface Zend_Loader_Autoloader_Interface
|
||||
{
|
||||
public function autoload($class);
|
||||
}
|
436
libs/Zend/Loader/Autoloader/Resource.php
Normal file
436
libs/Zend/Loader/Autoloader/Resource.php
Normal file
@ -0,0 +1,436 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@zend.com so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Loader
|
||||
* @subpackage Autoloader
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @version $Id: Resource.php 14026 2009-02-09 19:03:22Z matthew $
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/** Zend_Loader_Autoloader_Interface */
|
||||
require_once 'Zend/Loader/Autoloader/Interface.php';
|
||||
|
||||
/**
|
||||
* Resource loader
|
||||
*
|
||||
* @uses Zend_Loader_Autoloader_Interface
|
||||
* @package Zend_Loader
|
||||
* @subpackage Autoloader
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license New BSD {@link http://framework.zend.com/license/new-bsd}
|
||||
*/
|
||||
class Zend_Loader_Autoloader_Resource implements Zend_Loader_Autoloader_Interface
|
||||
{
|
||||
/**
|
||||
* @var string Base path to resource classes
|
||||
*/
|
||||
protected $_basePath;
|
||||
|
||||
/**
|
||||
* @var array Components handled within this resource
|
||||
*/
|
||||
protected $_components = array();
|
||||
|
||||
/**
|
||||
* @var string Default resource/component to use when using object registry
|
||||
*/
|
||||
protected $_defaultResourceType;
|
||||
|
||||
/**
|
||||
* @var string Namespace of classes within this resource
|
||||
*/
|
||||
protected $_namespace;
|
||||
|
||||
/**
|
||||
* @var array Available resource types handled by this resource autoloader
|
||||
*/
|
||||
protected $_resourceTypes = array();
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param array|Zend_Config $options Configuration options for resource autoloader
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($options)
|
||||
{
|
||||
if ($options instanceof Zend_Config) {
|
||||
$options = $options->toArray();
|
||||
}
|
||||
if (!is_array($options)) {
|
||||
require_once 'Zend/Loader/Exception.php';
|
||||
throw new Zend_Loader_Exception('Options must be passed to resource loader constructor');
|
||||
}
|
||||
|
||||
$this->setOptions($options);
|
||||
|
||||
$namespace = $this->getNamespace();
|
||||
if ((null === $namespace)
|
||||
|| (null === $this->getBasePath())
|
||||
) {
|
||||
require_once 'Zend/Loader/Exception.php';
|
||||
throw new Zend_Loader_Exception('Resource loader requires both a namespace and a base path for initialization');
|
||||
}
|
||||
|
||||
Zend_Loader_Autoloader::getInstance()->unshiftAutoloader($this, $namespace);
|
||||
}
|
||||
|
||||
/**
|
||||
* Overloading: methods
|
||||
*
|
||||
* Allow retrieving concrete resource object instances using 'get<Resourcename>()'
|
||||
* syntax. Example:
|
||||
* <code>
|
||||
* $loader = new Zend_Loader_Autoloader_Resource(array(
|
||||
* 'namespace' => 'Stuff_',
|
||||
* 'basePath' => '/path/to/some/stuff',
|
||||
* ))
|
||||
* $loader->addResourceType('Model', 'models', 'Model');
|
||||
*
|
||||
* $foo = $loader->getModel('Foo'); // get instance of Stuff_Model_Foo class
|
||||
* </code>
|
||||
*
|
||||
* @param string $method
|
||||
* @param array $args
|
||||
* @return mixed
|
||||
* @throws Zend_Loader_Exception if method not beginning with 'get' or not matching a valid resource type is called
|
||||
*/
|
||||
public function __call($method, $args)
|
||||
{
|
||||
if ('get' == substr($method, 0, 3)) {
|
||||
$type = strtolower(substr($method, 3));
|
||||
if (!$this->hasResourceType($type)) {
|
||||
require_once 'Zend/Loader/Exception.php';
|
||||
throw new Zend_Loader_Exception("Invalid resource type $type; cannot load resource");
|
||||
}
|
||||
if (empty($args)) {
|
||||
require_once 'Zend/Loader/Exception.php';
|
||||
throw new Zend_Loader_Exception("Cannot load resources; no resource specified");
|
||||
}
|
||||
$resource = array_shift($args);
|
||||
return $this->load($resource, $type);
|
||||
}
|
||||
|
||||
require_once 'Zend/Loader/Exception.php';
|
||||
throw new Zend_Loader_Exception("Method '$method' is not supported");
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempt to autoload a class
|
||||
*
|
||||
* @param string $class
|
||||
* @return mixed False if not matched, otherwise result if include operation
|
||||
*/
|
||||
public function autoload($class)
|
||||
{
|
||||
$segments = explode('_', $class);
|
||||
$namespaceTopLevel = $this->getNamespace();
|
||||
$namespace = '';
|
||||
|
||||
if (!empty($namespaceTopLevel)) {
|
||||
$namespace = array_shift($segments);
|
||||
if ($namespace != $this->getNamespace()) {
|
||||
// wrong prefix? we're done
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (count($segments) < 2) {
|
||||
// assumes all resources have a component and class name, minimum
|
||||
return false;
|
||||
}
|
||||
|
||||
$final = array_pop($segments);
|
||||
$component = $namespace;
|
||||
$lastMatch = false;
|
||||
do {
|
||||
$segment = array_shift($segments);
|
||||
$component .= empty($component) ? $segment : '_' . $segment;
|
||||
if (isset($this->_components[$component])) {
|
||||
$lastMatch = $component;
|
||||
}
|
||||
} while (count($segments));
|
||||
|
||||
if (!$lastMatch) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$final = substr($class, strlen($lastMatch));
|
||||
$path = $this->_components[$lastMatch];
|
||||
return include $path . '/' . str_replace('_', '/', $final) . '.php';
|
||||
}
|
||||
|
||||
/**
|
||||
* Set class state from options
|
||||
*
|
||||
* @param array $options
|
||||
* @return Zend_Loader_Autoloader_Resource
|
||||
*/
|
||||
public function setOptions(array $options)
|
||||
{
|
||||
$methods = get_class_methods($this);
|
||||
foreach ($options as $key => $value) {
|
||||
$method = 'set' . ucfirst($key);
|
||||
if (in_array($method, $methods)) {
|
||||
$this->$method($value);
|
||||
}
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set namespace that this autoloader handles
|
||||
*
|
||||
* @param string $namespace
|
||||
* @return Zend_Loader_Autoloader_Resource
|
||||
*/
|
||||
public function setNamespace($namespace)
|
||||
{
|
||||
$this->_namespace = rtrim((string) $namespace, '_');
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get namespace this autoloader handles
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getNamespace()
|
||||
{
|
||||
return $this->_namespace;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set base path for this set of resources
|
||||
*
|
||||
* @param string $path
|
||||
* @return Zend_Loader_Autoloader_Resource
|
||||
*/
|
||||
public function setBasePath($path)
|
||||
{
|
||||
$this->_basePath = (string) $path;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get base path to this set of resources
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getBasePath()
|
||||
{
|
||||
return $this->_basePath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add resource type
|
||||
*
|
||||
* @param string $type identifier for the resource type being loaded
|
||||
* @param string $path path relative to resource base path containing the resource types
|
||||
* @param null|string $namespace sub-component namespace to append to base namespace that qualifies this resource type
|
||||
* @return Zend_Loader_Autoloader_Resource
|
||||
*/
|
||||
public function addResourceType($type, $path, $namespace = null)
|
||||
{
|
||||
$type = strtolower($type);
|
||||
if (!isset($this->_resourceTypes[$type])) {
|
||||
if (null === $namespace) {
|
||||
require_once 'Zend/Loader/Exception.php';
|
||||
throw new Zend_Loader_Exception('Initial definition of a resource type must include a namespace');
|
||||
}
|
||||
$namespaceTopLevel = $this->getNamespace();
|
||||
$namespace = ucfirst(trim($namespace, '_'));
|
||||
$this->_resourceTypes[$type] = array(
|
||||
'namespace' => empty($namespaceTopLevel) ? $namespace : $namespaceTopLevel . '_' . $namespace,
|
||||
);
|
||||
}
|
||||
if (!is_string($path)) {
|
||||
require_once 'Zend/Loader/Exception.php';
|
||||
throw new Zend_Loader_Exception('Invalid path specification provided; must be string');
|
||||
}
|
||||
$this->_resourceTypes[$type]['path'] = $this->getBasePath() . '/' . $path;
|
||||
|
||||
$component = $this->_resourceTypes[$type]['namespace'];
|
||||
$this->_components[$component] = $this->_resourceTypes[$type]['path'];
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add multiple resources at once
|
||||
*
|
||||
* $types should be an associative array of resource type => specification
|
||||
* pairs. Each specification should be an associative array containing
|
||||
* minimally the 'path' key (specifying the path relative to the resource
|
||||
* base path) and optionally the 'namespace' key (indicating the subcomponent
|
||||
* namespace to append to the resource namespace).
|
||||
*
|
||||
* As an example:
|
||||
* <code>
|
||||
* $loader->addResourceTypes(array(
|
||||
* 'model' => array(
|
||||
* 'path' => 'models',
|
||||
* 'namespace' => 'Model',
|
||||
* ),
|
||||
* 'form' => array(
|
||||
* 'path' => 'forms',
|
||||
* 'namespace' => 'Form',
|
||||
* ),
|
||||
* ));
|
||||
* </code>
|
||||
*
|
||||
* @param array $types
|
||||
* @return Zend_Loader_Autoloader_Resource
|
||||
*/
|
||||
public function addResourceTypes(array $types)
|
||||
{
|
||||
foreach ($types as $type => $spec) {
|
||||
if (!is_array($spec)) {
|
||||
require_once 'Zend/Loader/Exception.php';
|
||||
throw new Zend_Loader_Exception('addResourceTypes() expects an array of arrays');
|
||||
}
|
||||
if (!isset($spec['path'])) {
|
||||
require_once 'Zend/Loader/Exception.php';
|
||||
throw new Zend_Loader_Exception('addResourceTypes() expects each array to include a paths element');
|
||||
}
|
||||
$paths = $spec['path'];
|
||||
$namespace = null;
|
||||
if (isset($spec['namespace'])) {
|
||||
$namespace = $spec['namespace'];
|
||||
}
|
||||
$this->addResourceType($type, $paths, $namespace);
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Overwrite existing and set multiple resource types at once
|
||||
*
|
||||
* @see Zend_Loader_Autoloader_Resource::addResourceTypes()
|
||||
* @param array $types
|
||||
* @return Zend_Loader_Autoloader_Resource
|
||||
*/
|
||||
public function setResourceTypes(array $types)
|
||||
{
|
||||
$this->clearResourceTypes();
|
||||
return $this->addResourceTypes($types);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve resource type mappings
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getResourceTypes()
|
||||
{
|
||||
return $this->_resourceTypes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Is the requested resource type defined?
|
||||
*
|
||||
* @param string $type
|
||||
* @return bool
|
||||
*/
|
||||
public function hasResourceType($type)
|
||||
{
|
||||
return isset($this->_resourceTypes[$type]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the requested resource type
|
||||
*
|
||||
* @param string $type
|
||||
* @return Zend_Loader_Autoloader_Resource
|
||||
*/
|
||||
public function removeResourceType($type)
|
||||
{
|
||||
if ($this->hasResourceType($type)) {
|
||||
$namespace = $this->_resourceTypes[$type]['namespace'];
|
||||
unset($this->_components[$namespace]);
|
||||
unset($this->_resourceTypes[$type]);
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear all resource types
|
||||
*
|
||||
* @return Zend_Loader_Autoloader_Resource
|
||||
*/
|
||||
public function clearResourceTypes()
|
||||
{
|
||||
$this->_resourceTypes = array();
|
||||
$this->_components = array();
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set default resource type to use when calling load()
|
||||
*
|
||||
* @param string $type
|
||||
* @return Zend_Loader_Autoloader_Resource
|
||||
*/
|
||||
public function setDefaultResourceType($type)
|
||||
{
|
||||
if ($this->hasResourceType($type)) {
|
||||
$this->_defaultResourceType = $type;
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get default resource type to use when calling load()
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getDefaultResourceType()
|
||||
{
|
||||
return $this->_defaultResourceType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Object registry and factory
|
||||
*
|
||||
* Loads the requested resource of type $type (or uses the default resource
|
||||
* type if none provided). If the resource has been loaded previously,
|
||||
* returns the previous instance; otherwise, instantiates it.
|
||||
*
|
||||
* @param string $resource
|
||||
* @param string $type
|
||||
* @return object
|
||||
* @throws Zend_Loader_Exception if resource type not specified or invalid
|
||||
*/
|
||||
public function load($resource, $type = null)
|
||||
{
|
||||
if (null === $type) {
|
||||
$type = $this->getDefaultResourceType();
|
||||
if (empty($type)) {
|
||||
require_once 'Zend/Loader/Exception.php';
|
||||
throw new Zend_Loader_Exception('No resource type specified');
|
||||
}
|
||||
}
|
||||
if (!$this->hasResourceType($type)) {
|
||||
require_once 'Zend/Loader/Exception.php';
|
||||
throw new Zend_Loader_Exception('Invalid resource type specified');
|
||||
}
|
||||
$namespace = $this->_resourceTypes[$type]['namespace'];
|
||||
$class = $namespace . '_' . ucfirst($resource);
|
||||
if (!isset($this->_resources[$class])) {
|
||||
$this->_resources[$class] = new $class;
|
||||
}
|
||||
return $this->_resources[$class];
|
||||
}
|
||||
}
|
@ -101,8 +101,12 @@ class Zend_Loader_PluginLoader implements Zend_Loader_PluginLoader_Interface
|
||||
{
|
||||
if (is_string($staticRegistryName) && !empty($staticRegistryName)) {
|
||||
$this->_useStaticRegistry = $staticRegistryName;
|
||||
self::$_staticPrefixToPaths[$staticRegistryName] = array();
|
||||
self::$_staticLoadedPlugins[$staticRegistryName] = array();
|
||||
if(!isset(self::$_staticPrefixToPaths[$staticRegistryName])) {
|
||||
self::$_staticPrefixToPaths[$staticRegistryName] = array();
|
||||
}
|
||||
if(!isset(self::$_staticLoadedPlugins[$staticRegistryName])) {
|
||||
self::$_staticLoadedPlugins[$staticRegistryName] = array();
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($prefixToPaths as $prefix => $path) {
|
||||
@ -118,6 +122,9 @@ class Zend_Loader_PluginLoader implements Zend_Loader_PluginLoader_Interface
|
||||
*/
|
||||
protected function _formatPrefix($prefix)
|
||||
{
|
||||
if($prefix == "") {
|
||||
return $prefix;
|
||||
}
|
||||
return rtrim($prefix, '_') . '_';
|
||||
}
|
||||
|
||||
@ -332,10 +339,13 @@ class Zend_Loader_PluginLoader implements Zend_Loader_PluginLoader_Interface
|
||||
* Load a plugin via the name provided
|
||||
*
|
||||
* @param string $name
|
||||
* @return string Class name of loaded class
|
||||
* @param bool $throwExceptions Whether or not to throw exceptions if the
|
||||
* class is not resolved
|
||||
* @return string|false Class name of loaded class; false if $throwExceptions
|
||||
* if false and no class found
|
||||
* @throws Zend_Loader_Exception if class not found
|
||||
*/
|
||||
public function load($name)
|
||||
public function load($name, $throwExceptions = true)
|
||||
{
|
||||
$name = $this->_formatName($name);
|
||||
if ($this->isLoaded($name)) {
|
||||
@ -378,6 +388,10 @@ class Zend_Loader_PluginLoader implements Zend_Loader_PluginLoader_Interface
|
||||
}
|
||||
|
||||
if (!$found) {
|
||||
if (!$throwExceptions) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$message = "Plugin by name '$name' was not found in the registry; used paths:";
|
||||
foreach ($registry as $prefix => $paths) {
|
||||
$message .= "\n$prefix: " . implode(PATH_SEPARATOR, $paths);
|
||||
|
Reference in New Issue
Block a user