在php中加载之前自动选择文件位置

时间:2011-10-20 14:18:40

标签: php

我需要创建一个简单的文件重载系统,就像symfony一样用php文件和模板。我将举一个例子来解释我的需求:

鉴于此文件夹结构:

 - root_folder
    - modules
       -module1
         -file1.php
         -file2.php
         -file3.php

    - specific_modules
       -module1
         -file2.php

我想找到一种自动加载文件的方法,如果在调用时在specific_modules文件夹(file2.php)中找到它,如果找不到,它应该正常从modules目录加载file2.php。 / p>

我想为程序员不费吹灰之力地做,但不确定它是否可能!!

欢迎任何帮助或建议,谢谢!

skarvin

3 个答案:

答案 0 :(得分:2)

如果文件只包含具有相同名称的对象,则可以编写自己的自动加载器功能并将其注册到spl_autoload_register()。也许像是

function my_loader($class)
{
    // look in specific_modules dir for $class
    // if not there, look in modules dir for $class
}
spl_autoload_register('my_loader');

这将允许您简单地编码为:

$obj = new Thing();

如果Thing在specific_modules中定义,它将使用那个,否则为默认值。

答案 1 :(得分:1)

$normal_dir = 'modules';
$specific_dir = 'specific_modules';

$modules = array('module1' => array('file1.php','file2.php','file3.php'));

foreach($modules as $module => $files)
{
    foreach($files as $file)
    {
        if(!file_exists("$specific_dir/$module/$file"))
        {
            include("$normal_dir/$module/$file");
        }
        else
        {
            include("$specific_dir/$module/$file");
        }
    }
}

此代码将尽可能简单地为您工作,它可以轻松地将新文件添加到您的模块并更改目录名称。通过“加载”我假设你的意思是包括,但那部分很容易改变。

答案 2 :(得分:0)

与Alex的回答相似,您还可以定义__autoload函数:

function __autoload($class_name) {
    if (file_exists(__DIR__ . '/specific_modules/' . $class_name . '.php')) {
        require __DIR__ . '/specific_modules/' . $class_name . '.php';
    }
    elseif (file_exists(__DIR__ . '/modules/' . $class_name . '.php')) {
        require __DIR__ . '/modules/' . $class_name . '.php';
    }
    else {
        // Error
    }
}

然后,如果你$obj = new Thing();,它会尝试从这两个目录中加载Thing.php