加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 如何使用__autoload从多个目录加载类?

发布时间:2020-12-13 21:43:45 所属栏目:PHP教程 来源:网络整理
导读:继续这个 question,似乎只需使用下面的__autoload代码就可以解决重复的问题, function __autoload($class_name) { include AP_SITE."classes_1/class_".$class_name.".php";}$connection = new database_pdo(DSN,DB_USER,DB_PASS);var_dump($connection); 结
继续这个 question,似乎只需使用下面的__autoload代码就可以解决重复的问题,

function __autoload($class_name) 
{
    include AP_SITE."classes_1/class_".$class_name.".php";
}

$connection = new database_pdo(DSN,DB_USER,DB_PASS);
var_dump($connection);

结果,

object(database_pdo)[1]
  protected 'connection' => 
    object(PDO)[2]

但这只从一个目录加载类,其他目录呢?因为我将类分组在不同的目录中.如果我想从其他目录加载类,我会得到错误,

function __autoload($class_name) 
{
    include AP_SITE."classes_1/class_".$class_name.".php";
    include AP_SITE."classes_2/class_".$class_name.".php";
}

信息,

Warning:
include(C:/wamp/www/art_on_your_doorstep_2011_MVC/global/applications/CART/classes_2/class_database_pdo.php)
[function.include]: failed to open stream: No such file or directory
in …

引用此行 – 包括AP_SITE.“classes_2 / class _”.$class_name.“.php”;

所以,我的问题是 – 如何使用__autoload从多个目录加载类?

可能的解决方案:

function autoload_class_multiple_directory($class_name) 
{

    # List all the class directories in the array.
    $array_paths = array(
        'classes_1/','classes_2/'
    );

    # Count the total item in the array.
    $total_paths = count($array_paths);

    # Set the class file name.
    $file_name = 'class_'.strtolower($class_name).'.php';

    # Loop the array.
    for ($i = 0; $i < $total_paths; $i++) 
    {
        if(file_exists(AP_SITE.$array_paths[$i].$file_name)) 
        {
            include_once AP_SITE.$array_paths[$i].$file_name;
        } 
    }
}

spl_autoload_register('autoload_class_multiple_directory');

解决方法

您可以使用 spl_autoload_register而不是单个__autoload函数注册多个自动加载功能.这是推荐的方式.

如果一个自动加载器能够加载该文件,则不会调用堆栈中的下一个.

但是,每个自动加载器只应加载它所用的类,因此您需要通过classname和/或is_file来检查它.通过classname通常会更好,因为如果应用程序增长,在文件系统上疯狂地尝试会给系统带来压力.

为了不重新发明轮子,您甚至可以使用已经存在的自动加载器,它能够在文件名调用上处理PSR-0标准.这些通常允许在基本目录上注册特定的命名空间.在您的情况下,这意味着您必须根据PSR-0 convention重命名和组织文件.

快速解决方案(绑定到您的问题):

function __autoload($class_name) 
{
    $file = sprintf('%sclasses_1/class_%s.php',AP_SITE,$class_name);
    if (is_file($file))
    {
        include $file;
        return;
    }
    $file = sprintf('%sclasses_2/class_%s.php',$class_name);
    if (is_file($file))
    {
        include $file;
        return;
    }
}

正如您所看到的,已经存在代码重复(在您的代码中).因此,这应该只是一个临时解决方案,因为您最终会为要测试的每个目录提供越来越多的重复行.如果您考虑更改设计,请考虑PSR-0 shema,它有助于简化一个代码库,并且可以轻松地重用PHP世界中的其他现有组件.

function autoload_class_multiple_directory($class_name) 
{

    # List all the class directories in the array.
    $array_paths = array(
        'classes_1/','classes_2/'
    );

    foreach($array_paths as $path)
    {
        $file = sprintf('%s%s/class_%s.php',$path,$class_name);
        if(is_file($file)) 
        {
            include_once $file;
        } 

    }
}

spl_autoload_register('autoload_class_multiple_directory');

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读