0

到目前为止,这是我在 stackoverflow 上的第三个问题:D

我在我的 first_run.php 文件上定义文件及其位置,我在这里定义的文件是那些包含类、辅助函数和任何其他所需文件的文件

在早期开发中,这个 first_run.php 仅包含几行代码,但随着我添加一些新类或要包含的新文件,该行逐渐增加

由于我将文件的位置分组在一个特定的文件夹中,我想也许我可以扫描文件夹,将检索到的文件的名称放入一个数组中,然后循环 require_once,这样我就不必每次都编辑 first_run.php我在文件夹中添加了一个新文件。

我的第一个方法是使用 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;

我还没有尝试过'after'代码。这可能吗??还是有其他方法?还是我应该就这样(继续添加行而不扫描文件)

提前致谢

4

4 回答 4

3

考虑改用自动加载

使用自动加载,您根本不必费心包含文件。每当你实例化一个 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。建议使用类名约定,如 fi PEAR,以便更轻松地查找文件并减少include_paths.

为了提高安全性和速度,您可以提供更复杂的 Autoloader,它使用数组从 classname 映射到 filename,从而确保仅包含实际属于应用程序一部分的文件。

进一步阅读:

于 2010-09-07T08:01:33.020 回答
1

这是可能的,但不推荐,例如如果有人可以在该目录上创建一个 php 文件,您最终会包含它,此外,您无法预测包含顺序。

试试这个:

$includes=array(
  'member',
  'phone',
  'profile',
  'talent',
);

foreach($includes as $fname) {
  require_once(MEMBERS.DS.$fname. '.php');

}

如果您正在使用类,请考虑使用自动加载,正如@Gordon 建议的那样。如果您不使用类,请考虑使用它们 :)

于 2010-09-07T08:03:42.077 回答
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);
于 2010-09-07T14:05:40.943 回答
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);
}
于 2010-09-07T08:04:57.737 回答