在php中加载文件之前自动选择文件位置
我需要创建一个简单的文件重载系统,就像symfony使用php文件和模板所做的那样。我将举例说明我需要什么: 给定此文件夹结构:在php中加载文件之前自动选择文件位置,php,Php,我需要创建一个简单的文件重载系统,就像symfony使用php文件和模板所做的那样。我将举例说明我需要什么: 给定此文件夹结构: - root_folder - modules -module1 -file1.php -file2.php -file3.php - specific_modules -module1 -file2.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文件:/所以删除第一行和最后一行,就可以开始了。