Index: library/Zend/Loader/Autoloader.php =================================================================== --- library/Zend/Loader/Autoloader.php (revision 19083) +++ library/Zend/Loader/Autoloader.php (working copy) @@ -120,16 +120,10 @@ if ($autoloader->autoload($class)) { return true; } - } elseif (is_string($autoloader)) { - if ($autoloader($class)) { + } elseif (is_callable($autoloader)) { + if (call_user_func($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; - } } } @@ -166,15 +160,36 @@ * Set several autoloader callbacks at once * * @param array $autoloaders Array of PHP callbacks (or Zend_Loader_Autoloader_Interface implementations) to act as autoloaders + * @param bool $validate Ensure each element is valid * @return Zend_Loader_Autoloader */ - public function setAutoloaders(array $autoloaders) + public function setAutoloaders(array $autoloaders, $validate = true) { + if ($validate) { + foreach ($autoloaders as $autoloader) { + $this->_validateCallback($autoloader); + } + } $this->_autoloaders = $autoloaders; return $this; } /** + * Tests if $callback is a valid callback or an instance of + * Zend_Loader_Autoloader_Interface + * + * @param mixed $callback Callback to validate + * @throws Zend_Loader_Exception If $callback is invalid + */ + protected function _validateCallback($callback) + { + if (!is_callable($callback, true) && !($callback instanceof Zend_Loader_Autoloader_Interface)) { + throw new Zend_Loader_Exception('Argument must be a valid callback or + an instance of Zend_Loader_Autoloader_Interface'); + } + } + + /** * Get attached autoloader implementations * * @return array @@ -372,9 +387,10 @@ */ public function unshiftAutoloader($callback, $namespace = '') { + $this->_validateCallback($callback); $autoloaders = $this->getAutoloaders(); array_unshift($autoloaders, $callback); - $this->setAutoloaders($autoloaders); + $this->setAutoloaders($autoloaders, false); $namespace = (array) $namespace; foreach ($namespace as $ns) { @@ -395,9 +411,10 @@ */ public function pushAutoloader($callback, $namespace = '') { + $this->_validateCallback($callback); $autoloaders = $this->getAutoloaders(); array_push($autoloaders, $callback); - $this->setAutoloaders($autoloaders); + $this->setAutoloaders($autoloaders, false); $namespace = (array) $namespace; foreach ($namespace as $ns) { @@ -422,7 +439,7 @@ $autoloaders = $this->getAutoloaders(); if (false !== ($index = array_search($callback, $autoloaders, true))) { unset($autoloaders[$index]); - $this->setAutoloaders($autoloaders); + $this->setAutoloaders($autoloaders, false); } foreach ($this->_namespaceAutoloaders as $ns => $autoloaders) {