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

标签 php loader autoloader

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

正如这里提到的:autoloader brief over view
PHP 自动加载器的工作原理

The PHP Autoloader searches recursively in defined directories for class, trait and interface definitions. Without any further configuration the directory in which the requiring file resides will be used as default class path.

File names don't need to obey any convention. All files are searched for class definitions. Files which are similar to the class name or end with .php or .inc are preferred. If supported, PHP Tokenizer will be used for reliable class definition discovery.

最佳答案

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 被注册为自动加载器。

创建新类时,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 文件的包含路径。

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

关于php - php 自动加载器是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57424307/

相关文章:

php - 如何在 Laravel 5.4 中添加自定义用户提供程序

javascript - 在以下情况下如何显示图像加载器,直到来自 AJAX 请求的响应出现?

html - 如何阻止滚动直到加载程序不显示任何内容?

php - class_exists 正在调用 spl_autoload_register

无法通过 spl_autoload_register 加载具有命名空间的 PHP 类?

PHP 7.1 货币计算

php - 文档级读取权限联结表?

php - 如何将 MySQL 列值从数组转换为字符串

ios - Application Loader 由于可执行名称拒绝二进制文件