|
|
- <?php
- namespace SparkLib;
-
- define('SLASH', DIRECTORY_SEPARATOR);
-
- /**
- * A simple but configurable autoloader. Expects everything to
- * live under the directory specified by LIBDIR, with most classes
- * under LIBDIR/classes/.
- *
- * <code>
- * define('LIBDIR', '/path/to/your/code/lib/');
- * require LIBDIR . 'classes/SparkLib/Autoloader.php';
- * </code>
- */
- class Autoloader {
-
- /**
- * Set this to declare explicit include paths, relative to
- * AUTOLOADER_INCLUDE_ROOT, for things that don't conform to
- * the classes/ClassName.php pattern. For example:
- *
- * <code>
- * \SparkLib\Autoloader::$classPath = array(
- * 'CupsPrintIPP' => 'phpprintipp/php_classes/CupsPrintIPP.php',
- * 'SphinxClient' => 'classes/sphinxapi.php',
- * );
- * </code>
- */
- public static $classPath = array();
-
- /**
- * Set this to declare special directories for classes containing
- * a given substring.
- *
- * <code>
- * \SparkLib\Autoloader::$searchPaths = array(
- * 'Saurus' => 'classes/dinosaurs/',
- * );
- * </code>
- */
- public static $searchPaths = array();
-
- /**
- * Set this to define any extra files which should be included
- * if we fail to find a class.
- */
- public static $extraAutoloaders = array();
-
- /**
- * Install this puppy as an autoloader, do some basic configuration.
- */
- public static function setup ()
- {
- // TODO
- // Get this in full conformance with:
- // http://groups.google.com/group/php-standards/web/psr-0-final-proposal?pli=1
- // ...and see about just setting include_path() instead of knowing an absolute
- // path to things.
-
- // If LIBDIR isn't defined, assume that this file lives in a path like
- // /somepath/lib/classes/SparkLib/, where we want somepath/lib/ to be
- // our include root...
- if (constant('LIBDIR')) {
- define('AUTOLOADER_INCLUDE_ROOT', LIBDIR);
- } else {
- define(
- 'AUTOLOADER_INCLUDE_ROOT',
- realpath(dirname(__FILE__) . SLASH . '..' . SLASH . '..' . SLASH)
- );
- }
-
- // Register autoloaders
- spl_autoload_register(array('\SparkLib\Autoloader', 'load'));
- }
-
- /**
- * Do the actual business of autoloading.
- *
- * @param string name of class
- */
- public static function load ($class)
- {
- if (isset(self::$classPath[$class])) {
- $path = self::$classPath[$class];
- }
- else {
- // TODO: All these strpos() calls are probably expensive.
- foreach (static::$searchPaths as $substr => $dir) {
- // we first check for a \, which indicates a namespace
- // - those we want to skip
- if ((false === strpos($class, '\\')) && (false !== strpos($class, $substr))) {
- $path = $dir . $class . '.php';
- break;
- }
- }
- }
-
- // If we got here, try for a corresponding file in classes
- if (! isset($path)) {
- $class = str_replace('\\', SLASH, $class);
- $path = 'classes' . SLASH . $class . '.php';
- }
-
- $full_path = AUTOLOADER_INCLUDE_ROOT . SLASH . $path;
- if (is_file($full_path)) {
- include $full_path;
- } else {
- // If we've got any fallback autoloaders, pull 'em in so
- // they can try to find the class in question
- foreach (static::$extraAutoloaders as $autoloader_path) {
- include_once($autoloader_path);
- }
- }
- }
-
- }
|