Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在php中加载文件之前自动选择文件位置_Php - Fatal编程技术网

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

在php中加载文件之前自动选择文件位置,php,Php,我需要创建一个简单的文件重载系统,就像symfony使用php文件和模板所做的那样。我将举例说明我需要什么: 给定此文件夹结构: - root_folder - modules -module1 -file1.php -file2.php -file3.php - specific_modules -module1 -file2.php 我想找到一种方法,如果调用时在特定的_

我需要创建一个简单的文件重载系统,就像symfony使用php文件和模板所做的那样。我将举例说明我需要什么:

给定此文件夹结构:

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

    - specific_modules
       -module1
         -file2.php
我想找到一种方法,如果调用时在特定的_modules文件夹(file2.php)中找到一个文件,那么它会自动加载该文件。如果找不到该文件,它通常应该从modules目录加载file2.php

我想为程序员做这件事,但不确定这是否可能

欢迎任何帮助或建议,提前感谢


skarvin

如果文件仅包含同名对象,则您可以编写自己的自动加载函数并向注册。也许像

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,它将使用该模块,否则将使用默认模块

$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");
        }
    }
}

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

与Alex的回答类似,您也可以定义一个
\uu 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=newthing()
它将尝试从这两个目录加载
Thing.php

这是一个非常优雅的解决方案。我的问题是,我正在处理一个非常旧的网站,根本没有任何类。文件结构如我的帖子所示。我想对类复制相同的行为,但在找到特定的_模块时,只包括其中的特定文件。我知道我可以在每个文件中包含一个函数来执行此检查,但我想知道是否存在一种非结构化的方法来执行此检查。无论如何,非常感谢!我想这意味着我要检查的每个文件都要使用它,不是吗?是的,我的意思是包括:)@skarvin:当然,但重要的部分是
文件\u exists
部分。重新将其转换为更动态的解决方案很容易。很好,但正如我对Alex所说的,我没有使用类,只使用普通的和旧的php文件:/所以删除第一行和最后一行,就可以开始了。