Files
server/usr/share/psa-pear/pear/php/Horde/Autoloader.php
2026-01-07 20:52:11 +01:00

160 lines
4.0 KiB
PHP

<?php
/**
* Copyright 2008-2016 Horde LLC (http://www.horde.org/)
*
* See the enclosed file COPYING for license information (LGPL). If you
* did not receive this file, see http://www.horde.org/licenses/lgpl21.
*
* @category Horde
* @copyright 2008-2016 Horde LLC
* @license http://www.horde.org/licenses/lgpl21 LGPL 2.1
* @package Autoloader
*/
/**
* Horde autoloader implementation.
*
* Manages an application's class name to file name mapping conventions. One or
* more class-to-filename mappers are defined, and are searched in LIFO order.
*
* @author Bob Mckee <bmckee@bywires.com>
* @author Chuck Hagenbuch <chuck@horde.org>
* @category Horde
* @copyright 2008-2016 Horde LLC
* @license http://www.horde.org/licenses/lgpl21 LGPL 2.1
* @package Autoloader
*/
class Horde_Autoloader
{
/**
* List of callback methods.
*
* @var array
*/
private $_callbacks = array();
/**
* List of classpath mappers.
*
* @var array
*/
private $_mappers = array();
/**
* Register the autoloader with PHP (in a way to play well with as many
* configurations as possible).
*/
public function registerAutoloader()
{
spl_autoload_register(array($this, 'loadClass'));
if (function_exists('__autoload')) {
spl_autoload_register('__autoload');
}
}
/**
* Loads a class into the current environment by classname.
*
* @param string $className Classname to load.
*
* @return boolean True if the class was successfully loaded.
*/
public function loadClass($className)
{
if (($path = $this->mapToPath($className)) &&
$this->_include($path)) {
$className = $this->_lower($className);
if (isset($this->_callbacks[$className])) {
call_user_func($this->_callbacks[$className]);
}
return true;
}
return false;
}
/**
* Adds a class path mapper to the beginning of the queue.
*
* @param Horde_Autoloader_ClassPathMapper $mapper A mapper object.
*
* @return Horde_Autoloader This instance.
*/
public function addClassPathMapper(Horde_Autoloader_ClassPathMapper $mapper)
{
array_unshift($this->_mappers, $mapper);
return $this;
}
/**
* Add a callback to run when a class is loaded through loadClass().
*
* @param string $class The classname.
* @param mixed $callback The callback to run when the class is loaded.
*/
public function addCallback($class, $callback)
{
$this->_callbacks[$this->_lower($class)] = $callback;
}
/**
* Search registered mappers in LIFO order.
*
* @param string $className Classname to load.
*
* @return mixed Pathname to class, or null if not found.
*/
public function mapToPath($className)
{
foreach ($this->_mappers as $mapper) {
if (($path = $mapper->mapToPath($className)) &&
$this->_fileExists($path)) {
return $path;
}
}
return null;
}
/**
* Include a file.
*
* @param string $path Pathname of file to include.
*
* @return boolean Success.
*/
protected function _include($path)
{
return (bool)include $path;
}
/**
* Does a file exist?
*
* @param string $path Pathname of file to check.
*
* @return boolean Does file exist?
*/
protected function _fileExists($path)
{
return file_exists($path);
}
/**
* Locale independant strtolower() implementation.
*
* @param string $string The string to convert to lowercase.
*
* @return string The lowercased string, based on ASCII encoding.
*/
protected function _lower($string)
{
$language = setlocale(LC_CTYPE, 0);
setlocale(LC_CTYPE, 'C');
$string = strtolower($string);
setlocale(LC_CTYPE, $language);
return $string;
}
}