Beispiel #1
0
 /**
  * Tries to autoload the given className. If the className could be found
  * this method returns true, otherwise false.
  *
  * This class caches the requested class names (including the ones who
  * failed to load).
  *
  * @param string $className  The name of the class that should be loaded.
  *
  * @return bool
  */
 public static function autoload($className)
 {
     ezcBase::setPackageDir();
     // Check whether the classname is already in the cached autoloadArray.
     if (array_key_exists($className, ezcBase::$autoloadArray)) {
         // Is it registered as 'unloadable'?
         if (ezcBase::$autoloadArray[$className] == false) {
             return false;
         }
         ezcBase::loadFile(ezcBase::$autoloadArray[$className]);
         return true;
     }
     // Check whether the classname is already in the cached autoloadArray
     // for external repositories.
     if (array_key_exists($className, ezcBase::$externalAutoloadArray)) {
         // Is it registered as 'unloadable'?
         if (ezcBase::$externalAutoloadArray[$className] == false) {
             return false;
         }
         ezcBase::loadExternalFile(ezcBase::$externalAutoloadArray[$className]);
         return true;
     }
     // Not cached, so load the autoload from the package.
     // Matches the first and optionally the second 'word' from the classname.
     $fileNames = array();
     if (preg_match("/^([a-z0-9]*)([A-Z][a-z0-9]*)([A-Z][a-z0-9]*)?/", $className, $matches) !== false) {
         $autoloadFile = "";
         // Try to match with both names, if available.
         switch (sizeof($matches)) {
             case 4:
                 // check for x_y_autoload.php
                 $autoloadFile = strtolower("{$matches[2]}_{$matches[3]}_autoload.php");
                 $fileNames[] = $autoloadFile;
                 if (ezcBase::requireFile($autoloadFile, $className, $matches[1])) {
                     return true;
                 }
                 // break intentionally missing.
             // break intentionally missing.
             case 3:
                 // check for x_autoload.php
                 $autoloadFile = strtolower("{$matches[2]}_autoload.php");
                 $fileNames[] = $autoloadFile;
                 if (ezcBase::requireFile($autoloadFile, $className, $matches[1])) {
                     return true;
                 }
                 // check for autoload.php
                 $autoloadFile = 'autoload.php';
                 $fileNames[] = $autoloadFile;
                 if (ezcBase::requireFile($autoloadFile, $className, $matches[1])) {
                     return true;
                 }
                 break;
         }
         // Maybe there is another autoload available.
         // Register this classname as false.
         ezcBase::$autoloadArray[$className] = false;
     }
     $path = ezcBase::$packageDir . 'autoload/';
     $realPath = realpath($path);
     if ($realPath == '') {
         // Can not be tested, because if this happens, then the autoload
         // environment has not been set-up correctly.
         trigger_error("Couldn't find autoload directory '{$path}'", E_USER_ERROR);
     }
     $dirs = self::getRepositoryDirectories();
     if (ezcBase::$options && ezcBase::$options->debug) {
         throw new ezcBaseAutoloadException($className, $fileNames, $dirs);
     }
     return false;
 }