php自动加载器是如何工作的

meW*_*arn 12 php loader autoloader

php类Autoloader是否打开文件并检查类名?我一直在研究它是如何实际实现的.有一件事我知道它的递归?如果我错了请告诉我

如上所述:autoloader简介视图 PHP Autoloader的工作原理

PHP Autoloader在定义的目录中递归搜索类,特征和接口定义.在没有任何进一步配置的情况下,需求文件所在的目录将用作默认类路径.

文件名不需要遵守任何约定.搜索所有文件的类定义.与类名相似或以.php或.inc结尾的文件是首选.如果支持,PHP Tokenizer将用于可靠的类定义发现.

Jvd*_*erg 17

PHP自动加载器只是在构造类包含文件的机制.

如果您将所有类放在1个文件中,则不需要自动加载器.当然,在编写OO时,每个类都有自己的文件,这就是自动加载器的用武之地.

一些例子:

class AutoLoader
{  
  public function __construct()
  {
    spl_autoload_register( array( $this, 'ClassLoader' ));
  }

  public function ClassLoader( $class )
  {    
    if( class_exists( $class, false ))
      return true;

    if( is_readable( 'path_to_my_classes/' . $class . '.php' ))
          include_once 'path_to_my_classes/' . $class . '.php'
  }
}

$autoloader = new AutoLoader();
Run Code Online (Sandbox Code Playgroud)

这里发生的是,当创建自动加载器类时,类方法Classloader被注册为自动加载器.

创建新类时,Classloader方法首先检查是否已加载该类的文件.如果没有,则该类前面有一个路径并扩展了扩展名.如果文件是可读的,则包含该文件.

当然,你可以把它变得非常复杂.让我们看一下名称空间和映射器的示例.假设我们在自动加载器类中:

  private $mapper array( 'Foo' => 'path_to_foo_files/', 'Bar' => 'path_to_bar_files/');

  public function ClassLoader( $class )
  {    
    if( class_exists( $class, false ))
      return true;

    // break into single namespace and class name
    $classparts = explode( '\\', $class ); 
    $path = $this->mapper[$classparts[0]];

    if( is_readable( $path . $classparts[1] . '.php' ))
          include_once $path . $classparts[1] . '.php'
  }
Run Code Online (Sandbox Code Playgroud)

这里,classname在命名空间部分和classname部分中分开.命名空间部分在映射器数组中查找,然后该路径用作php文件的包含路径.

这些只是演示自动加载器可以做什么的示例.对于生产,还有一些工作要做,例如错误检查.