我需要创建一个简单的文件重载系统,就像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
答案 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
。