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

2022-08-31 00:53:49

php 类自动加载器是否打开文件并检查类名?我一直在研究它是如何实际实施的。有一件事我知道它是递归的?如果我错了,请让我知道

如前所述:自动加载器简介概述PHP自动加载器的工作原理

PHP 自动加载程序在定义的目录中递归搜索类、特征和接口定义。无需任何进一步的配置,所需文件所在的目录将用作默认类路径。

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


答案 1

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();

这里发生的情况是,在创建自动加载器类时,类方法 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'
  }

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

这些只是演示自动装载机可以做什么的示例。对于生产,还有更多的工作要做,例如错误检查。


答案 2

推荐