You are here

function xautoload_ClassFinder_NamespaceOrPrefix::findFile in X Autoload 7.3

Same name and namespace in other branches
  1. 7.2 lib/ClassFinder/NamespaceOrPrefix.php \xautoload_ClassFinder_NamespaceOrPrefix::findFile()

Finds the path to the file where the class is defined.

Parameters

xautoload_InjectedAPI_findFile $api: API object with a suggestFile() method. We are supposed to call $api->suggestFile($file) with all suggestions we can find, until it returns TRUE. Once suggestFile() returns TRUE, we stop and return TRUE as well. The $file will be in the $api object, so we don't need to return it.

string $class: The name of the class, with all namespaces prepended. E.g. Some\Namespace\Some\Class

Return value

TRUE|NULL TRUE, if we found the file for the class. That is, if the $api->suggestFile($file) method returned TRUE one time. NULL, if we have no more suggestions.

Overrides xautoload_ClassFinder_Prefix::findFile

File

lib/ClassFinder/NamespaceOrPrefix.php, line 150

Class

xautoload_ClassFinder_NamespaceOrPrefix

Code

function findFile($api, $class) {
  if ('\\' === $class[0]) {
    $class = substr($class, 1);
  }

  // First check if the literal class name is registered.
  if (!empty($this->classes[$class])) {
    foreach ($this->classes[$class] as $filepath => $true) {
      if ($api
        ->suggestFile($filepath)) {
        return TRUE;
      }
    }
  }
  if (FALSE !== ($pos = strrpos($class, '\\'))) {

    // Loop through positions of '\\', backwards.
    $namespace_path_fragment = str_replace('\\', DIRECTORY_SEPARATOR, substr($class, 0, $pos + 1));
    $path_suffix = str_replace('_', DIRECTORY_SEPARATOR, substr($class, $pos + 1)) . '.php';
    if ($this->namespaceMap
      ->findFile_map($api, $namespace_path_fragment, $path_suffix)) {
      return TRUE;
    }
  }
  else {

    // The class is not within a namespace.
    // Fall back to the prefix-based finder.
    $prefix_path_fragment = str_replace('_', DIRECTORY_SEPARATOR, $class) . '.php';
    if ('_' === $class[0]) {
      $prefix_path_fragment[0] = '_';
    }
    if ($this->prefixMap
      ->findFile_map($api, $prefix_path_fragment, '')) {
      return TRUE;
    }
  }
}