XOOPS  2.6.0
Psr4ClassLoader.php
Go to the documentation of this file.
1 <?php
24 namespace Xoops\Core;
25 
92 {
99  protected $prefixes = array();
100 
111  public static function addLoader($namespace, $path)
112  {
113  $loaderClass = get_called_class();
114  $loader = new $loaderClass($namespace, $path);
115  if (is_array($path)) {
116  foreach ($path as $pathdir) {
117  $loader->addNamespace($namespace, $pathdir);
118  }
119  } else {
120  $loader->addNamespace($namespace, $path);
121  }
122  $loader->register();
123  return $loader;
124  }
125 
131  public function register()
132  {
133  spl_autoload_register(array($this, 'loadClass'));
134  }
135 
147  public function addNamespace($prefix, $base_dir, $prepend = false)
148  {
149  // normalize namespace prefix
150  $prefix = trim($prefix, '\\') . '\\';
151 
152  // normalize the base directory with a trailing separator
153  $base_dir = rtrim($base_dir, '/') . DIRECTORY_SEPARATOR;
154  $base_dir = rtrim($base_dir, DIRECTORY_SEPARATOR) . '/';
155 
156  // initialize the namespace prefix array
157  if (isset($this->prefixes[$prefix]) === false) {
158  $this->prefixes[$prefix] = array();
159  }
160 
161  // retain the base directory for the namespace prefix
162  if ($prepend) {
163  array_unshift($this->prefixes[$prefix], $base_dir);
164  } else {
165  array_push($this->prefixes[$prefix], $base_dir);
166  }
167  }
168 
177  public function loadClass($class)
178  {
179  // the current namespace prefix
180  $prefix = $class;
181 
182  // work backwards through the namespace names of the fully-qualified
183  // class name to find a mapped file name
184  while (false !== $pos = strrpos($prefix, '\\')) {
185  // retain the trailing namespace separator in the prefix
186  $prefix = substr($class, 0, $pos + 1);
187 
188  // the rest is the relative class name
189  $relative_class = substr($class, $pos + 1);
190 
191  // try to load a mapped file for the prefix and relative class
192  $mapped_file = $this->loadMappedFile($prefix, $relative_class);
193  if ($mapped_file !== false) {
194  return $mapped_file;
195  }
196 
197  // remove the trailing namespace separator for the next iteration
198  // of strrpos()
199  $prefix = rtrim($prefix, '\\');
200  }
201 
202  // never found a mapped file
203  return false;
204  }
205 
215  protected function loadMappedFile($prefix, $relative_class)
216  {
217  // are there any base directories for this namespace prefix?
218  if (isset($this->prefixes[$prefix]) === false) {
219  return false;
220  }
221 
222  // look through base directories for this namespace prefix
223  foreach ($this->prefixes[$prefix] as $base_dir) {
224  // replace the namespace prefix with the base directory,
225  // replace namespace separators with directory separators
226  // in the relative class name, append with .php
227  $file = $base_dir
228  . str_replace('\\', '/', $relative_class)
229  . '.php';
230 
231  // if the mapped file exists, require it
232  if ($this->requireFile($file)) {
233  // yes, we're done
234  return $file;
235  }
236  }
237 
238  // never found it
239  return false;
240  }
241 
249  protected function requireFile($file)
250  {
251  if (file_exists($file)) {
252  require $file;
253 
254  return true;
255  }
256 
257  return false;
258  }
259 }
$path
Definition: execute.php:31
static addLoader($namespace, $path)
if(!isset($xoops->paths[$path_type])) if($path_type== 'var') $file
Definition: browse.php:55
addNamespace($prefix, $base_dir, $prepend=false)
defined('DS') or define('DS' DIRECTORY_SEPARATOR
Definition: common.php:41
loadMappedFile($prefix, $relative_class)