[php5] __autoload uit meerdere directories

Pagina: 1
Acties:

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Ik gebruik voor het dynamisch laden van gebruikte classes de magic method __autoload. Dat doe ik op deze manier:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
function __autoload($className)
{
  $file = "lib/" . $className . ".php5";
  if ( file_exists($file) )
  {
    include $file;
  }
  else
  {
    // error
  }
}

Werkt goed zonder problemen, alleen ben ik nu verplicht alle classes in de lib directory te zetten. En dat wordt erg vervelend en onoverzichtelijk als je meer richting de 100 classes gaat. Hoe kan ik dit beter oplossen?

-Ik zou bijvoorbeeld naar de naam van de class kunnen kijken en op basis daarvan een include doen.

-Ik zou ook recursief alle directories in lib kunnen doorlopen en dan kijken of de class gevonden wordt. Maar of dit nou zo snel is... Natuurlijk zou ik ook bij de eerste lookup een array kunnen opbouwen met daarin alle beschikbare classes en de paden op basis van dat recursief uitlezen, en dan een flag zetten om dit de volgende keer te skippen.

Wat denken jullie. Mischien nog iemand die een leuke 'truuk' heeft?

[ Voor 4% gewijzigd door Michali op 13-10-2004 14:30 ]

Noushka's Magnificent Dream | Unity


  • Skaah
  • Registratie: Juni 2001
  • Niet online
Houd een array bij waarin staat welke class waar staat.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 02:00

.oisyn

Moderator Devschuur®

Demotivational Speaker

.edit: hier stond onzin, ik kende __autoload niet (is ook nergens iets over op php.net te vinden, behalve wat bugreports)

[ Voor 88% gewijzigd door .oisyn op 13-10-2004 15:56 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
.oisyn schreef op 13 oktober 2004 @ 15:54:
.edit: hier stond onzin, ik kende __autoload niet (is ook nergens iets over op php.net te vinden, behalve wat bugreports)
check die docs.php.net (ook in signature eens). Dit wordt de 'nieuwe' documentatie zeg maar. Staat ook over php5 OO mogelijkheden een stuk meer in. Ook over __autoload.
Skaah schreef op 13 oktober 2004 @ 15:40:
Houd een array bij waarin staat welke class waar staat.
Bedoel je een array die ik in een config bestand zet? Of de lib dir uitlezen en dan de array vullen? Ik zou ook een array kunnen genereren en deze dan wegschrijven in een php bestand.

[ Voor 32% gewijzigd door Michali op 13-10-2004 16:02 ]

Noushka's Magnificent Dream | Unity


  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025

kvdveer

Z.O.Z.

Je zou de klassen in een directories kunnen stoppen, en vervolgens lokaal linken met symlinks.
Je krijgt dan:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
\ <-- (webroot)
  \include
    \classes
      \output
        - class.htmloutput.php5
        - class.emailoutput.php5
        - class.nogeenoutput.php5
      \input
        - HTTPinput.php5
        - xterminput.php5
      \all
        - class.htmloutput.php5 <-- (symlink)
        - class.emailoutput.php5 <-- (symlink)
        - class.nogeenoutput.php5 <-- (symlink)
        - HTTPinput.php5 <-- (symlink)
        - xterminput.php5 <-- (symlink)


Je kunt de all directory dan opbouwen met een commando als
code:
1
2
3
cd [...]/all
rm * <-- (indien nodig)
ln -s ../*/* .

Localhost, sweet localhost


  • Skaah
  • Registratie: Juni 2001
  • Niet online
Of je kan bij het starten van je script snel de mappen indexeren: wat is waar.

  • Banpei
  • Registratie: Juli 2001
  • Laatst online: 21-05 14:21
Ik had zelf tijdens mijn __autoload escapades het systeem van Perl gebruikt. Indien een class op een andere extend moet deze dan in een subdirectory staan:

Class test:
staat als test.php in de root

Class test::html
staat als html.php in de directory test

Class test::xml
staat als xml.php in de directory test

Class test::xml::xql
staat als xql.php in de directory test/xml

Dan tijdens de __autoload dus een split op de classname doen en je hebt meteen de locatie. :)

[ Voor 14% gewijzigd door Banpei op 13-10-2004 17:44 ]


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Interesante reply's allemaal. Ik heb er toch voor gekozen om een assosiavieve array te vullen met als index de class naam en als waarde het pad waar deze te vinden is. Deze array vul ik als deze niet bestaat en sla ik vervolgens op in een sessie zodat dit maar 1 maal per sessie hoeft te gebeuren. Ik kan zo bij het laden van een class een simpele check met isset doen om te controleren of de class bekend is. Werkt perfect en ik ben vrij om alles in te delen zoals ik wil, wat ik wel fijn vind.

Noushka's Magnificent Dream | Unity

Pagina: 1