Avatar billede hypofysen Nybegynder
19. august 2009 - 09:47 Der er 6 kommentarer og
1 løsning

autoload subfolders

hvordan omskriver jeg denne stump kode, så filer i alle underliggende mapper også loades

<?php
function __autoload($class) {
  require_once("classes/".$class.".php");
}
?>
Avatar billede j4k0b Nybegynder
19. august 2009 - 10:40 #1
lav en rekursiv funktion der kalder sig selv for hver undermappe fundet, alá denne (ikke testet):


function __autoload($folder, $class) {
    require_once($folder .'/'. $class .'.php');
    $dh = opendir($dir);
    while(($sub = readdir($dh)) !== false) {
        if(filetype($folder, $sub) == 'dir') {
            __autoload($folder.'/'.$sub, $class);
        }
    }
    closedir($dh);
}

__autoload('/home/web/classes', 'testklasse');
Avatar billede hypofysen Nybegynder
19. august 2009 - 21:02 #2
har prøvet lidt af hvert nu, og får det overhovedet ikke til at lykkes :(
Avatar billede j4k0b Nybegynder
19. august 2009 - 21:14 #3
Hvorfor er det i øvrigt også at du vil inkludere alle filer i mappen samt undermapper? Du må vel vide hvad du står og skal bruge, og så er det vel bare at include det i flere linjer?
Avatar billede hypofysen Nybegynder
19. august 2009 - 21:19 #4
jeg fik løst problemet med dette:

define('ROOT_DIR', dirname(__FILE__).'/');

function __autoload($className) {
    $folder=classFolder($className);
    if($folder) require_once($folder.'/'.$className.'.php');
}

function classFolder($className,$folder='classes') {
    $dir=dir(ROOT_DIR.$folder);
    if($folder=='classes' && file_exists(ROOT_DIR.$folder.'/'.$className.'.php')) return $folder;
    else {
        while (false!==($entry=$dir->read())) {
            $checkFolder=$folder.'/'.$entry;
            if(strlen($entry)>2) {
                if(is_dir(ROOT_DIR.$checkFolder)) {
                    if(file_exists(ROOT_DIR.$checkFolder.'/'.$className.'.php'))
                    {
                    return $checkFolder;
                    }else {
                        $subFolder=classFolder($className,$checkFolder);
                        if($subFolder) return $subFolder;
                    }
                }
            }
        }
    }
    $dir->close();
    return 0;
}
Avatar billede j4k0b Nybegynder
19. august 2009 - 21:21 #5
Det er meget svært at skimte igennem og danne sig et overblik over hvad der sker, set i forhold til:

require_once 'classes/minklasse.php';
require_once 'classes/test/minklasse2.php';
require_once 'classes/john/klasse.php';
osv.
Avatar billede hypofysen Nybegynder
19. august 2009 - 21:24 #6
selvfølgelig ved jeg hvad jeg skal bruge, men synes nu det er smartere med en autoload, mine classes ligger ikke altid i mappen classes, men bliver hentet i pakker fra tidligere projekter, så for at skrive så lidt ny kode som muligt firetrækker jeg en autoload funktion der automatis henter min klasser unaset hvilken folder de er placeret i..
Avatar billede showsource Seniormester
19. august 2009 - 22:15 #7
Go' daw du !
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester