Использование php.scandir () для сканирования файлов, а затем требуется?

StackOverflow https://stackoverflow.com/questions/3656799

  •  01-10-2019
  •  | 
  •  

Вопрос

Это мой третий вопрос до сих пор на Stackoverflow: D

Я определяю файлы и их местоположение в моих файлах First_run.php, файлы, которые я определяю здесь, - это те файлы, содержащие классы, функции помощника и любые другие файлы

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

И поскольку я группирую местоположение файла внутри конкретной папки, я полагаю, что, возможно, я могу отсканировать папку, поместите имя файлов, полученных в массиве, а затем запирайте требование_once, чтобы я не должен редактировать First_run.php каждый раз Я добавляю новый файл внутри папки.

Мой подход FisRT использует Скандир ()

до:

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;

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

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

Это было полезно?

Решение

Рассмотреть возможность использования Автозагрузка вместо.

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

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

Дальнейшее чтение:

Другие советы

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

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

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

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

}

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

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

Создать 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top