这是我目前在stackoverflow上的第三个问题:D
我在first_run.php文件中定义文件及其位置, 我在这里定义的文件是那些包含类,辅助函数的文件 和任何其他文件
在早期开发中,这个first_run.php只包含几行代码 但随着我添加一些新类或要包含的新文件,这条线逐渐增加
由于我将文件的位置分组到特定文件夹中,我想可能我可以扫描文件夹,将检索到的文件的名称放入数组然后循环require_once,这样我就不必编辑first_run。 php每次在文件夹中添加一个新文件。
我的fisrt方法是使用scandir()
之前:
defined('INC_PATH') ? null : define('INC_PATH', SITE_ROOT.DS.'includes');
defined('MEMBERS') ? null : define('MEMBERS', INC_PATH.DS.'models'.DS.'members');
require_once(MEMBERS.DS.'member.php');
require_once(MEMBERS.DS.'phone.php');
require_once(MEMBERS.DS.'profile.php');
require_once(MEMBERS.DS.'talent.php');
require_once(MEMBERS.DS.'profile_picture.php');
require_once(MEMBERS.DS.'audio.php');
require_once(MEMBERS.DS.'video.php');
require_once(MEMBERS.DS.'gallery.php');
require_once(MEMBERS.DS.'statistik.php');
require_once(MEMBERS.DS.'inbox.php');
require_once(MEMBERS.DS.'comment.php');
require_once(MEMBERS.DS.'picked_stat.php');
require_once(MEMBERS.DS.'log.php');
之后是:
$member_files = scandir(MEMBERS);
foreach($member_files as $member_file):
require_once(MEMBERS.DS.$member_file);
endforeach;
我还没试过'后'代码。 这可能吗??或者还有其他方法吗?或者我应该这样离开(继续添加行而不扫描文件)
提前致谢
答案 0 :(得分:3)
请考虑使用Autoloading。
使用自动加载功能,您根本不需要包含文件。每当您实例化PHP当时不知道的新类时,PHP将触发注册的自动加载功能。该功能包括所需的文件。这样,您只需在需要时加载所需内容,这样可以提高性能。
PHP5.3的简单示例
spl_autoload_register(function($className) {
include "/path/to/lib/and/$className.php";
});
$foo = new Foo;
当您致电new Foo
时,注册的自动加载功能会尝试包含/path/to/lib/and/Foo.php
的课程。建议使用类名约定,如f.i. PEAR,以便更轻松地查找文件并减少include_paths
的数量。
为了提高安全性和速度,您可以提供更多sophisticated Autoloader that uses an array to map from classname to filename,从而确保只包含实际属于您的应用程序的文件。
进一步阅读:
答案 1 :(得分:1)
有可能,但不推荐,如果有人可以在该目录上创建一个php文件,你最终会包含它,此外,你无法预测包含顺序。
请改为尝试:
$includes=array(
'member',
'phone',
'profile',
'talent',
);
foreach($includes as $fname) {
require_once(MEMBERS.DS.$fname. '.php');
}
如果您正在使用课程,请考虑使用自动加载,正如@Gordon建议的那样。如果您没有使用类,请考虑使用它们:)
答案 2 :(得分:0)
乍一看,您的代码可以正常运行,但您必须忽略“。”和foreach循环中的“..”。另外,如果文件以“.php”结尾,我会检查:
$member_files = scandir(MEMBERS.DS);
foreach($member_files as $member_file) {
// Ignore non php files and thus ".." & "."
if (!preg_match('/\.php$/', $member_file) {
continue;
}
require_once(MEMBERS.DS.$member_file);
}
答案 3 :(得分:0)
创建2个功能
function GetFiles($directory,$exempt = array('.','..','.ds_store','.svn'),&$files = array()) {
$handle = opendir($directory);
while(false !== ($resource = readdir($handle))){
if(!in_array(strtolower($resource),$exempt)){
if(is_dir($directory.$resource.'/'))
array_merge($files, self::GetFiles($directory.$resource.'/',$exempt,$files));
else
$files[] = $directory.$resource;
}
}
closedir($handle);
return $files;
}
function Autoload($includes = array()){
$files = array();
foreach($includes as $directory)
$files[] = self::GetFiles($directory);
foreach($files as $k=>$v){
foreach($v as $k1=>$v1)
require_once($v1);
}
}
to use it:
$includes = array(
'C:WWW/project/helpers/',
'C:WWW/project/lang/',
'C:WWW/project/lib/',
'C:WWW/project/mod/',
);
Autoload($includes);