【问题标题】:Is PHP 5's autoload inefficient?PHP 5 的自动加载效率低吗?
【发布时间】:2012-03-07 08:16:45
【问题描述】:

当您手动包含一个 PHP 类时,您可以在当前脚本运行时执行它,对吗?然后你可以决定,如果一个条件匹配你加载它,如果不匹配你不加载。像这样:

if ( $_SERVER['REQUEST_METHOD'] === 'POST' ) {
    include '../../../Whatever/SanitizeUserInput.class.php';
    SanitizeUserInput::sanitize($_POST['someFieldName']);
}

但是假设我在这个类中使用了autoload 功能。会在开始时有效加载还是仅在使用时才加载?

我的意思是,我是否应该只在我 100% 确定将在任何脚本中使用的类中添加 __autoload 函数(例如数据库连接、会话管理等? )?

谢谢

【问题讨论】:

  • 将与@Timur 建议使用spl_autoload_register 一起使用,因为它似乎更灵活,从我的角度来看,我不明白为什么自动加载效率应该更低......这个想法是只加载一个类当基于您的自定义逻辑创建实例时......所以您应该擅长它
  • 是否使用自动加载也是简洁设计的问题。
  • @KingCrunch - 你认为哪一个是干净的?
  • 保持“我的班级在哪里?”取决于想要使用该类的自动加载器而不是代码。例如,您使用include,迟早会导致“类已定义”。
  • @martinstoeckli 使用自动加载更好,因为类的可移植性更好,而且更干净,因为您不需要在文件中写入所有include(..)

标签: php class include autoload


【解决方案1】:

仅当您尝试访问所需的类时才会调用自动加载。而且最好用spl_autoload_register()而不是__autoload

文档:

你可以定义一个自动调用的 __autoload() 函数 如果您尝试使用尚未使用的类/接口 尚未定义。

spl_autoload_register() 为 自动加载类。因此,使用 __autoload() 是 不鼓励,将来可能会被弃用或删除。

【讨论】:

    【解决方案2】:

    当您尝试使用尚未加载的类时,自动加载会启动:

    include 'foo.php';
    new Foo;  // autoload not used, because the class already exists
    
    // Bar is not yet loaded here, auto or otherwise
    
    new Bar; // Bar is being autoloaded, because it was not yet loaded
    

    因此,自动加载可以非常高效。由于调用自动加载函数的开销,它比在需要时手动加载类的效率略低。但是手动跟踪加载的类需要更多的工作,因为自动加载的回报很少。

    【讨论】:

      【解决方案3】:

      试一试,你会发现,每当 PHP 遇到一个它还不知道的类时,它就会调用你的自动加载函数。当你的自动加载函数告诉 PHP 类在哪个文件中时,它会加载这个文件。

      为了简单起见,PHP 只在需要时加载文件,即使对于条件也是如此,因此永远不会加载以下测试类。

      if (false)
      {
        $test = new CTest(); // never loaded with autoload.
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-16
        • 2011-05-03
        • 2013-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-04
        相关资源
        最近更新 更多