используя PHP.scandir () для сканирования файлов, а затем require_once их - PullRequest
0 голосов
/ 07 сентября 2010

это мой третий вопрос на стеке: 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;

Я не пробовал код после. Это возможно?? или есть другой подход ?? или я должен просто оставить это так (продолжайте добавлять строки, не сканируя файлы)

заранее спасибо

Ответы [ 4 ]

3 голосов
/ 07 сентября 2010

Подумайте об использовании Автозагрузка .

При автозагрузке вам не нужно вообще включать файлы.Всякий раз, когда вы создаете новый класс, который не известен 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.

.безопасность и скорость, вы можете предоставить более сложный автозагрузчик , который использует массив для сопоставления от имени класса к имени файла , таким образом, гарантируя, что в него могут быть включены только те файлы, которые действительно являются частью вашего приложения.Дополнительная информация:

1 голос
/ 07 сентября 2010

Это возможно, но не рекомендуется, например, если кто-то может создать php-файл в этом каталоге, вы в конечном итоге включите его, кроме того, вы не можете предсказать порядок включения.

Попробуйте этовместо этого:

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

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

}

Если вы использовали классы, рассмотрите возможность использования автозагрузки, как предложил @Gordon.И если вы не использовали классы, подумайте об их использовании:)

0 голосов
/ 07 сентября 2010

создать 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);
0 голосов
/ 07 сентября 2010

На первый взгляд ваш код может работать, хотя вы должны игнорировать "." и ".." в цикле 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);
}
...