. */ namespace Doctrine\Common; /** * A GlobalClassLoader is an autoloader for class files that can be * installed on the SPL autoload stack. A GlobalClassLoader must be the only * autoloader on the stack and be used for all classes. * * The GlobalClassLoader assumes the PHP 5.3 namespace separator but * is also compatible with the underscore "_" namespace separator. * * A recommended class loading setup for optimal performance looks as follows: * * 1) Use a GlobalClassLoader. * 2) Reduce the include_path to only the path to the PEAR packages. * 2) Register the namespaces of any other (non-pear) class library with their * absolute base paths, like this: $gcl->registerNamespace('Zend', '/path/to/zf-lib'); * * If no base path is configured for a certain namespace, the GlobalClassLoader relies on * the include_path. * * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link www.doctrine-project.org * @since 2.0 * @version $Revision: 3938 $ * @author Guilherme Blanco * @author Jonathan Wage * @author Roman Borschel */ class GlobalClassLoader { /** * @var string File extension used for classes */ private $_defaultFileExtension = '.php'; /** * @var array The custom file extensions of class libraries. */ private $_fileExtensions = array(); /** * @var array Hashmap of base paths to class libraries. */ private $_basePaths = array(); /** * Installs this class loader on the SPL autoload stack as the only class loader. * * @throws DoctrineException If the SPL autoload stack already contains other autoloaders. */ public function register() { if (spl_autoload_functions() !== false) { throw new DoctrineException("Autoload stack is not empty. GlobalClassLoader does not work " . "in an autoload stack."); } spl_autoload_register(array($this, 'loadClass')); } /** * Sets the default file extension of class files. * * @param string $extension * @return void */ public function setDefaultFileExtension($extension) { $this->_fileExtension = $extension; } /** * Sets a static base path for classes with a certain prefix that is prepended * to the path derived from the class itself. * * @param string $classPrefix The prefix (root namespace) of the class library. * @param string $basePath The base path to the class library. * @param string $fileExtension The custom file extension used by the class files in the namespace. */ public function registerNamespace($namespace, $basePath, $fileExtension = null) { $this->_basePaths[$namespace] = $basePath; if ($fileExtension !== null) { $this->_fileExtensions[$namespace] = $fileExtension; } } /** * Loads the given class or interface. * * @param string $classname The name of the class to load. * @return boolean TRUE if the class has been successfully loaded, FALSE otherwise. */ public function loadClass($className) { $prefix = ''; $separator = '\\'; if (($pos = strpos($className, $separator)) !== false) { $prefix = substr($className, 0, strpos($className, $separator)); } else if (($pos = strpos($className, '_')) !== false) { // Support for '_' namespace separator for compatibility with the "old" standard $prefix = substr($className, 0, strpos($className, '_')); $separator = '_'; } require ((isset($this->_basePaths[$prefix])) ? $this->_basePaths[$prefix] . DIRECTORY_SEPARATOR : '') . str_replace($separator, DIRECTORY_SEPARATOR, $className) . (isset($this->_fileExtensions[$prefix]) ? $this->_fileExtensions[$prefix] : $this->_defaultFileExtension); } }