使用`spl_autoload_register()`的`spl_autoload_extension()`的用法是什么?

时间:2012-07-26 07:02:34

标签: php function spl-autoload-register

我正在使用spl_autoload_register()函数来包含所有文件。我想要的是任何有.class.php.php分机的班级都会直接包含。我在下面做了并注册了两个不同的功能,一切正常,但是

我认为有一些方法可以让我只需要注册一个函数来同时包含两个扩展。

请查看我的功能并告诉我我缺少的东西

我的文件夹结构

project
      -classes
           -alpha.class.php
           -beta.class.php
           -otherclass.php
      -includes
           - autoload.php
      -config.inc.php // define CLASS_DIR and include 'autoload.php'

autoload.php

var_dump(__DIR__); // 'D:\xampp\htdocs\myproject\includes' 
var_dump(CLASS_DIR); // 'D:/xampp/htdocs/myproject/classes/' 
spl_autoload_register(null, false);
spl_autoload_extensions(".php, .class.php"); // no use for now
/*** class Loader ***/
class AL
{
     public static function autoload($class)
     {
          $filename = strtolower($class) . '.php';
          $filepath = CLASS_DIR.$filename;
          if(is_readable($filepath)){
              include_once $filepath;
          }
//          else {
//                trigger_error("The class file was not found!", E_USER_ERROR);
//            }
    }

    public static function classLoader($class)
    {
        $filename = strtolower($class) . '.class.php';
        $filepath = CLASS_DIR . $filename;
        if(is_readable($filepath)){
              include_once $filepath;
          }
    }

}
spl_autoload_register('AL::autoload');
spl_autoload_register('AL::classLoader');

注意:对第spl_autoload_extensions();行没有影响。为什么呢?

我还阅读了this blog,但不明白如何实施。

2 个答案:

答案 0 :(得分:3)

你这样做的方式没有错。两种类型文件的两个独特的自动加载器很好,但我会给它们稍微更具描述性的名称;)

  

注意:对spl_autoload_extensions();行没有影响。为什么呢?

这只会影响内置自动加载spl_autoload()

也许在所有

之后使用单个加载器会更容易
 public static function autoload($class)
 {
      if (is_readable(CLASS_DIR.strtolower($class) . '.php')) {
          include_once CLASS_DIR.strtolower($class) . '.php';
      }  else if (is_readable(CLASS_DIR.strtolower($class) . '.class.php')) {
          include_once CLASS_DIR.strtolower($class) . '.class.php';
      }
}

您也可以省略整个班级

spl_autoload_register(function($class) {
    if (is_readable(CLASS_DIR.strtolower($class) . '.php')) {
        include_once CLASS_DIR.strtolower($class) . '.php';
    }  else if (is_readable(CLASS_DIR.strtolower($class) . '.class.php')) {
        include_once CLASS_DIR.strtolower($class) . '.class.php';
    }
});

答案 1 :(得分:1)

也许这会有所帮助:

http://php.net/manual/de/function.spl-autoload-extensions.php

  

Jeremy Cook 03-Sep-2010 06:46

     

使用此功能添加自己的自动加载功能的任何人的快速说明   扩展。我发现,如果我在其间包含一个空格   不同的扩展(即'.php,.class.php')函数不会   工作。为了让它工作,我不得不删除之间的空格   扩展名(即'.php,.class.php')。这是在PHP 5.3.3中测试的   Windows和我正在使用spl_autoload_register()而不添加任何内容   自定义自动加载功能。

     

希望能帮助某人。