Avatar billede dennism Nybegynder
01. marts 2007 - 15:33 Der er 27 kommentarer og
1 løsning

PHP: OO, mange klasser?

Jeg har et objekt orienteret website, som er skrevet i PHP. Sitet indeholder efterhånden ca. 15 klassefiler og flere bliver løbende skrevet.
Som det er nu, includerer jeg først disse klasser, når de skal bruges. Dette kan dog gode blive lidt problematisk i længden, da man kunne forestille sig at man kunne komme til at includere den samme klasse flere gange.

Mit spørgsmål er, at om det ødelægge sidens loading-time væsentligt, hvis man vælger i starten hver side at inkludere samtligt klasser? Script-sproget bliver jo oversat på serveren, så er lidt i tvivl om, om webbrugeren i den sidste ende vil kunne mærke nogen forskel?
Avatar billede limemedia Nybegynder
01. marts 2007 - 15:48 #1
jo flere includes, jo langsommere bliver din side

hvis du ikke kan planlaegge dig ud af at have problemer med at inkludere de samme filer flere steder, kan du bruge include_once og require_once der loeser problemet for dig
Avatar billede dennism Nybegynder
01. marts 2007 - 15:56 #2
Hvad er forskellen på include og include_once, og include og require_once?
Avatar billede limemedia Nybegynder
01. marts 2007 - 15:58 #3
"include" betyder at du inkluderer filen
"include_once" betyder at du inkluderer filen, hvis den ikke allerede er inkluderet et andet sted

saa skift alle dine includes, med include_once, og dit system virker
Avatar billede dennism Nybegynder
01. marts 2007 - 15:59 #4
Det lyder godt :)
Kan du så også forklare mig forskellen på include og require?
Avatar billede limemedia Nybegynder
01. marts 2007 - 16:12 #5
hvis filen i en include ikke kan findes, resulterer det i en notice, mens det i en require vil resultere i en fatal error
Avatar billede Slettet bruger
01. marts 2007 - 16:47 #6
Er du ude efter hastighed saa hold dig fra include_once som er langsommere end include.
I PHP5 kan du bruge __autoload til at tage dig af dine klasser.

Nu ved jeg ikke hvor mange besoegende du skal tage dig mvh, men jeg har selv koert en del sider med inkludering af alle filer i starten uden problemer - selvfoelgelig er det en smule langsommere.
Avatar billede dennism Nybegynder
01. marts 2007 - 16:57 #7
Regin >>

Jeg er igang med at lave en ny stor portal - så der skulle helst ikke være noget galt med hastigheden. Men det er klart, at hvis vi snakker 1/50 af et sekund, så gør det ikke det store. Vil du vurdere, at jeg sagtens kan hente alle klasser ind fra start?

Hvis vi kan blive enige om, at indhentning af alle mine klasser hvad gang, ikke vil ødelægge loadtime merkant, så ser jeg ikke noget problem I at bruge __autoload?
Avatar billede Slettet bruger
01. marts 2007 - 19:00 #8
"Jeg er igang med at lave en ny stor portal" > tror ikke at det med klasserne skal være dit hovedfokus på hastighed før du står med problemet med for meget trafik... :/

Anyway, __autoload() virker fint!
Avatar billede dennism Nybegynder
01. marts 2007 - 19:17 #9
Regin >>

Jeg synes dit svar ovenover var lidt kryptisk - undskyld mig :) Det du siger, er det at jeg først bør hente klasserne når jeg skal bruge dem?
Avatar billede Slettet bruger
01. marts 2007 - 19:39 #10
Ja lidt i øst og vest... brug __autoload()
Avatar billede dennism Nybegynder
01. marts 2007 - 20:12 #11
At bruge __autoload er vel netop at hente alle klasserne på en gang?
Avatar billede Slettet bruger
02. marts 2007 - 08:52 #12
Nej... det er at hente klasser naar der er brug for dem...

<?
//erklaer autoload
function __autoload($className)
{
    //include class logic!
}

//nu kalder vi en klasse der ikke er erklaeret.
$object = new fooObject;
//foer ovenstaaende linie vil __autoload() blive kaldt,
$object1 = new fooObject;
//__autoload() vil ikke blive kaldt her for nu er fooObject allerede blevet erklaeret!
?>
Avatar billede dennism Nybegynder
02. marts 2007 - 11:12 #13
Jeg skal altsaa lave en __autoload($className) til hver af mine klasser?
Avatar billede Slettet bruger
02. marts 2007 - 12:26 #14
Avatar billede dennism Nybegynder
02. marts 2007 - 16:24 #15
regin >>

Skal jeg så have en indlude til alle mine klasser i __autoload() ?
Avatar billede Slettet bruger
03. marts 2007 - 14:02 #16
hver __autoload bør kun hente en klasse afgangen (vil automatisk blive kaldt en ekstra gang hvis klassen extender en eksisterende).

hvis du f.eks. gemmer dine klasser på formen /classes/{$className}.class.php

kan du skrive din:
function __autoload($className)
{
    include '/classes/'.$className.'.class.php';
}
Avatar billede dennism Nybegynder
03. marts 2007 - 14:43 #17
Og hver gang jeg så laver en $classBook = new book(); så kører PHP en __autoload("book") ?
Avatar billede Slettet bruger
03. marts 2007 - 20:36 #18
lige præcis.
Avatar billede dennism Nybegynder
04. marts 2007 - 16:47 #19
Jeg kan desværre ikke få det til at virke.

Jeg har f.eks. en klasse i /classes/design.php.

I mit script kører jeg denne linie:
$designClass->top();

I toppen af koden af jeg denne funktion:
function __autoload($className)
{
    echo "henter:".$className;
    $className = substr($className, 0, strlen($className)-5);
    include("/classes/".$className.".php");
}
Jeg har lavet den substr, sådan at designClass bliver til design, da det er navnet på klassen.

Jeg får en "Undefined variable: designClass"..hvordan kan det være?
Avatar billede Slettet bruger
04. marts 2007 - 22:15 #20
Prøv med lidt debugging... kan ikke umiddelbart sige hvor det går galt...

Bliver __autoload() kaldt?
Bliver den ønskede fil inkluderet?
Avatar billede dennism Nybegynder
05. marts 2007 - 07:58 #21
Jeg har prøvet debugging :) Derfor jeg har en echo i _autoload. Men den bliver ikke kørt. hvordan kan det være?
Avatar billede Slettet bruger
05. marts 2007 - 08:35 #22
Er du sikker paa du koerer PHP5 paa serveren?
Avatar billede dennism Nybegynder
05. marts 2007 - 09:38 #23
Ja, jeg kører 5.1.6
Avatar billede Slettet bruger
05. marts 2007 - 12:05 #24
sikker paa at function __autoload() er included?
f.eks.:
echo 'including __autoload(): ';
function __autoload($className){
//etc...
}
Avatar billede Slettet bruger
05. marts 2007 - 12:06 #25
Har du erklaeret $designClass ?
Avatar billede dennism Nybegynder
05. marts 2007 - 13:48 #26
Hvad mener du med, at jeg skal include __autoload? Funktionen bliver konstrueret i toppen af min .php-fil.

Jeg har ikke erlæret $designClass..er det ikke det __autoload skal sørge for?
Avatar billede Slettet bruger
05. marts 2007 - 13:58 #27
Jeg mener:
$designClass = new designClass();

Proev eventuelt at skriv hele fejlmeddelelsen.
Avatar billede dennism Nybegynder
05. marts 2007 - 16:55 #28
Så fik jeg det til at fungere - tak for hjælpen!
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