【问题标题】:how does php autoloader worksphp自动加载器是如何工作的
【发布时间】:2019-12-16 20:32:54
【问题描述】:

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

如上所述:autoloader brief over view PHP 自动加载器的工作原理

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

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

【问题讨论】:

  • 看起来您问题中的链接已经足够了解
  • "php 类 Autoloader 是否打开文件并检查类名?" -- 它搜索文件中的所有类。
  • 但是我在哪里可以知道它是如何实现的,从头开始自动加载器的整个过程,这对我来说很有趣,因为它最初是如何编写的
  • PHP 的源代码。不过,祝你好运。
  • 为什么@BoltClock, you know it's real fun stuff 在源地那边。

标签: php loader autoloader


【解决方案1】:

PHP 自动加载器只是一种在构造包含文件的机制。

如果你把所有的类放在一个文件中,你就不需要自动加载器。当然,在编程 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 文件的包含路径。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-16
    • 2019-01-01
    • 1970-01-01
    • 2013-10-03
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多