2012-11-18 59 views
2

我想使用PSR-0标准方式来自动加载类,而不需要添加包括,例如,我怎么能代替下面的代码与自动装载机制:PHP 5.3自动加载器

namespace Example; 
use MyLib\Controller; 
include_once './library/MyLib/Controller/AbstractController.php'; 
class MyController extends Controller\AbstractController { 
[...] 

所以在上面的例子中,它表明,在每一个控制器我需要包括抽象控制器,这是疯了...

我已经找到了PSR-0代码在这里:

https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md

https://gist.github.com/221634

但我不知道^ h我需要在我的应用程序中实现这一点。

+0

http://symfony.com/doc/current/components/class_loader.html HTTP: //getcomposer.org/doc/00-intro.md – igorw

回答

3

你需要包括(包括/ require语句),如果你选择使用的作曲家自动加载的应用程序中与

的第一个脚本自动加载磁带机代码的文件@Skpd说,那么你应该在你的第一个PHP脚本的顶部有这样的代码。

include_once __DIR__ . '/composer_autoloader.php' 

$loader = new \Composer\Autoload\ClassLoader(); 
$loader->add('MyLib', __DIR__.'/library/'); 
$loader->register(); 

如果你决定使用作曲家你的供应商经理,然后添加您的自定义命名空间到你composer.json,包括vendor/autoload.php

1

您需要使用自动加载器。有例子的类加载器从作曲:

<?php 

/* 
* This file is part of Composer. 
* 
* (c) Nils Adermann <[email protected]n.de> 
*  Jordi Boggiano <[email protected]> 
* 
* For the full copyright and license information, please view the LICENSE 
* file that was distributed with this source code. 
*/ 

namespace Composer\Autoload; 

/** 
* ClassLoader implements a PSR-0 class loader 
* 
* See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md 
* 
*  $loader = new \Composer\Autoload\ClassLoader(); 
* 
*  // register classes with namespaces 
*  $loader->add('Symfony\Component', __DIR__.'/component'); 
*  $loader->add('Symfony',   __DIR__.'/framework'); 
* 
*  // activate the autoloader 
*  $loader->register(); 
* 
*  // to enable searching the include path (eg. for PEAR packages) 
*  $loader->setUseIncludePath(true); 
* 
* In this example, if you try to use a class in the Symfony\Component 
* namespace or one of its children (Symfony\Component\Console for instance), 
* the autoloader will first look for the class under the component/ 
* directory, and it will then fallback to the framework/ directory if not 
* found before giving up. 
* 
* This class is loosely based on the Symfony UniversalClassLoader. 
* 
* @author Fabien Potencier <[email protected]> 
* @author Jordi Boggiano <[email protected]> 
*/ 
class ClassLoader 
{ 
    private $prefixes = array(); 
    private $fallbackDirs = array(); 
    private $useIncludePath = false; 
    private $classMap = array(); 

    public function getPrefixes() 
    { 
     return $this->prefixes; 
    } 

    public function getFallbackDirs() 
    { 
     return $this->fallbackDirs; 
    } 

    public function getClassMap() 
    { 
     return $this->classMap; 
    } 

    /** 
    * @param array $classMap Class to filename map 
    */ 
    public function addClassMap(array $classMap) 
    { 
     if ($this->classMap) { 
      $this->classMap = array_merge($this->classMap, $classMap); 
     } else { 
      $this->classMap = $classMap; 
     } 
    } 

    /** 
    * Registers a set of classes 
    * 
    * @param string  $prefix The classes prefix 
    * @param array|string $paths The location(s) of the classes 
    */ 
    public function add($prefix, $paths) 
    { 
     if (!$prefix) { 
      foreach ((array) $paths as $path) { 
       $this->fallbackDirs[] = $path; 
      } 

      return; 
     } 
     if (isset($this->prefixes[$prefix])) { 
      $this->prefixes[$prefix] = array_merge(
       $this->prefixes[$prefix], 
       (array) $paths 
      ); 
     } else { 
      $this->prefixes[$prefix] = (array) $paths; 
     } 
    } 

    /** 
    * Turns on searching the include path for class files. 
    * 
    * @param bool $useIncludePath 
    */ 
    public function setUseIncludePath($useIncludePath) 
    { 
     $this->useIncludePath = $useIncludePath; 
    } 

    /** 
    * Can be used to check if the autoloader uses the include path to check 
    * for classes. 
    * 
    * @return bool 
    */ 
    public function getUseIncludePath() 
    { 
     return $this->useIncludePath; 
    } 

    /** 
    * Registers this instance as an autoloader. 
    * 
    * @param bool $prepend Whether to prepend the autoloader or not 
    */ 
    public function register($prepend = false) 
    { 
     spl_autoload_register(array($this, 'loadClass'), true, $prepend); 
    } 

    /** 
    * Unregisters this instance as an autoloader. 
    */ 
    public function unregister() 
    { 
     spl_autoload_unregister(array($this, 'loadClass')); 
    } 

    /** 
    * Loads the given class or interface. 
    * 
    * @param string $class The name of the class 
    * @return bool|null True, if loaded 
    */ 
    public function loadClass($class) 
    { 
     if ($file = $this->findFile($class)) { 
      include $file; 

      return true; 
     } 
    } 

    /** 
    * Finds the path to the file where the class is defined. 
    * 
    * @param string $class The name of the class 
    * 
    * @return string|null The path, if found 
    */ 
    public function findFile($class) 
    { 
     if ('\\' == $class[0]) { 
      $class = substr($class, 1); 
     } 

     if (isset($this->classMap[$class])) { 
      return $this->classMap[$class]; 
     } 

     if (false !== $pos = strrpos($class, '\\')) { 
      // namespaced class name 
      $classPath = str_replace('\\', DIRECTORY_SEPARATOR, substr($class, 0, $pos)) . DIRECTORY_SEPARATOR; 
      $className = substr($class, $pos + 1); 
     } else { 
      // PEAR-like class name 
      $classPath = null; 
      $className = $class; 
     } 

     $classPath .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php'; 

     foreach ($this->prefixes as $prefix => $dirs) { 
      if (0 === strpos($class, $prefix)) { 
       foreach ($dirs as $dir) { 
        if (file_exists($dir . DIRECTORY_SEPARATOR . $classPath)) { 
         return $dir . DIRECTORY_SEPARATOR . $classPath; 
        } 
       } 
      } 
     } 

     foreach ($this->fallbackDirs as $dir) { 
      if (file_exists($dir . DIRECTORY_SEPARATOR . $classPath)) { 
       return $dir . DIRECTORY_SEPARATOR . $classPath; 
      } 
     } 

     if ($this->useIncludePath && $file = stream_resolve_include_path($classPath)) { 
      return $file; 
     } 

     return $this->classMap[$class] = false; 
    } 
} 
+1

有问题的链接已经很好,这里的问题是,OP不知道如何使用它,以及如何正确设置目录结构以使用psr-0自动加载器。 –