PHP: автоматическое включение - PullRequest
1 голос
/ 18 апреля 2011

Я использую много включаемых файлов, чтобы включить мои 191 файл в коллекцию функций, классов и т. Д.

Проблема для меня в том, что я действительно не люблю редактировать файлы включения, это приводит к большим беспорядкам, и иногда я просто забываю включить что-то.

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

Эти вещи делают жизнь намного проще и гибче.

Ответы [ 4 ]

3 голосов
/ 18 апреля 2011

Если у вас есть стандарт между именами классов и файлами, вы можете использовать функцию __autoload().Это сэкономит вам много включений.

http://php.net/manual/en/language.oop5.autoload.php

2 голосов
/ 18 апреля 2011

Вы можете использовать следующую функцию, которую я только что создал:

function load_folder($folder, $ext = '.php') {
    foreach (glob("$folder*$ext") as $file) { 
        if (file_exists($file)) {
            require_once($file);
        }
    }
}

START EDIT

Это новая версия той же функции.Теперь он позволяет указывать папки как folder или folder/ без сбоев.Также теперь он загружает все файлы во все папки и подпапки.

function load_folder($dir, $ext = '.php') {
    if (substr($dir, -1) != '/') { $dir = "$dir/"; }
    if($dh = opendir($dir)) {
        $files = array();
        $inner_files = array();
        while($file = readdir($dh)) {
            if($file != "." and $file != ".." and $file[0] != '.') {
                if(is_dir($dir . $file)) {
                    $inner_files = load_folder($dir . $file);
                    if(is_array($inner_files)) $files = array_merge($files, $inner_files); 
                } else {
                    array_push($files, $dir . $file);
                }
            }
        }
        closedir($dh);
        foreach ($files as $file) {
            if (is_file($file) and file_exists($file)) {
                $lenght = strlen($ext);
                if (substr($file, -$lenght) == $ext) { require_once($file); }
            }
        } 
    }
}

END EDIT

Вы также можете указать конкретное расширение, если хотите загрузить только для примера.txt файлы в папке, которую вы можете выполнить, выглядят так: load_folder('folder/', '.txt');.Помните, что кто-то думает, что это как-то небезопасно.Прежде чем использовать эту функцию на бизнес-сайте, поищите больше мнений по теме.Также обратите внимание, что если некоторые из ваших файлов относятся к классам, вы можете использовать нативную функцию PHP __autoload(), чтобы позволить PHP вызывать класс там, где он действительно необходим (отложенная загрузка).

Ссылки:

1 голос
/ 18 апреля 2011

Я обычно требую в качестве первого application_top.php с этим:

...

function requireAll($folder){
    // open the folder
    $libs = opendir($folder);
    // loop inside to include each file, excluding windows default 'meta-link' . and ..
    while ($lib = readdir($libs)) {
        if ($lib != "." && $lib != "..")
            // require_once to be sure to require only one time
            require_once $folder . $lib;
}
    // close the dir for cleaning stuff
closedir($libs);
}

//Require all helpers   
requireAll(DIR_HELPERS);

//Require all model classes 
requireAll(DIR_MODEL);

//Require all mappers   
requireAll(DIR_MAPPERS);

...
1 голос
/ 18 апреля 2011

Вы можете просто иметь файл «meta-include», в котором есть отдельные операторы include, и тогда вы включаете только один этот файл в свои скрипты.

Конечно, автозагрузка версий в других ответах здесь будет более эффективной. Хотя PHP довольно быстр при загрузке / разборе, 191 отдельный файл для загрузки для каждого запроса складывается довольно быстро.

...