Sk!ppy Skrevet 9. februar 2010 Del Skrevet 9. februar 2010 Hei. Jeg lager et cms, for å lære mer php. Jeg har en fil, som skal includere alle andre klassene, og starte dem. strukturen min er sånn: -admin -cache -plugins -template -class --classes.php index.php .htaccess classes.php er følgende <?php class classes { function get_classes() { if ($handle = opendir('./class/')) { while (false !== ($file = readdir($handle))) { if ($file != "." && $file != "..") { echo "$file <br>"; } } closedir($handle); } } } ?> og index.php er <?php include("class/classes.php"); $class = new classes; $class->get_classes(); ?> Jeg har et lite problem, $class->get_classes(); includerer alle filene i mappen class/ - men deretter må jeg jo ha $var = new class; for vær eneste klasse? har da to spørsmål: Er det en måte å gjøre dette enklere på? Kan det gjøres ved extend? eller hvordan funker egentlig extends, hvordan kaller man extends? Lenke til kommentar
quantum Skrevet 9. februar 2010 Del Skrevet 9. februar 2010 Skal du lage akkurat en instans av hver klasse du har definert? Og hva mener du med å starte dem? Normalt så oppretter du instanser av klasser "at will" rundt omkring i koden din, og er de definert i andre filer må du bruke include. Enkelte klasser ønsker man dog å ha én og bare én global instans av, og disse implementerer man etter Singleton-mønster : http://en.wikipedia.org/wiki/Singleton_pattern#PHP Du kan forsåvidt la alle klassene henge sammen i en «arverekkefølge» vha extends, men det blir bare en litt mer komplisert måte å oppnå det samme totalt meningsløse resultatet du kan få ved å putte alt sammen i en klasse. «extends» er nøkkelordet du bruker for å indikere en arverelasjon (inheritance) mellom to klasser, den ene arver fra, er en utvidelse av, den andre. Ta en kikk på dette før du går videre, spesielt avsnittet om Inheritance. http://en.wikipedia.org/wiki/Object_orientation Lenke til kommentar
BlueEAGLE Skrevet 10. februar 2010 Del Skrevet 10. februar 2010 Det vi i BeBot-teamet fant ut var at vi brukte __construct() og fikk hver klasse til å registrere seg i en matrise (eng. array). I filene så kjørte vi da $modulelist[] = new classname($procid); i filen som inneholder klassen, men utenfor selve klassedeklarasjonen slik at klassen ble initialisert og registrerte seg med riktig prosess. De utførte også litt grunnleggende oppsettssjekk i opprettelsen som å sjekke at databasetabellene den hadde bruk for eksisterte og alle tilkoblinger den hadde bruk for kunne opprettes. Før vi kjørte igjennom alle modulene så måtte vi selvfølgelig initialisere klassene med infrastruktur (databaseomslag, feilsjekkingssytem m.v.). Håper dette hjelper. Lenke til kommentar
Sk!ppy Skrevet 10. februar 2010 Forfatter Del Skrevet 10. februar 2010 Det hjalp ikke så veldig mye, Så jeg kjører sånn $db = new database; i vær fil classes.php - Går sikkert bra, da jeg lager ikke nye classes så ofte etter å gjort det i starten Lenke til kommentar
Loomy Skrevet 10. februar 2010 Del Skrevet 10. februar 2010 (endret) "I starten"? Du må huske på at dette er tilstandsløs web/PHP, så det du gjør her skjer i i teorien ved hver eneste request. In other news: Du kan ta en titt på autoloading: http://php.net/manual/en/language.oop5.autoload.php Hvis du har en fornuftig navnekonvensjon på klassene dine (f.eks Klassenavn.class.php) kan du med en autoload kjøre new Klassenavn uten å måtte inkludere hver og en fil manuelt eller via mappelesing. Men alt i alt mistenker jeg at du har misforstått et par grunnleggende prinsipper med OOP, så det er mulig du bør lese litt grundig om det før du går videre. Endret 10. februar 2010 av Loomy Lenke til kommentar
BlueEAGLE Skrevet 10. februar 2010 Del Skrevet 10. februar 2010 "I starten"? Du må huske på at dette er tilstandsløs web/PHP, så det du gjør her skjer i i teorien ved hver eneste request. Cluet er "i BeBot-teamet". Jeg skulle selvfølgelig lagt inn det som en lenke men BeBot er en CLI-applikasjon. Lenke til kommentar
Loomy Skrevet 10. februar 2010 Del Skrevet 10. februar 2010 (endret) Aha, da blir det jo litt annerledes, men vha. ren sannsynlighetsberegning antok jeg at det ikke var CLI i trådstarters tilfelle Endret 10. februar 2010 av Loomy Lenke til kommentar
BlueEAGLE Skrevet 10. februar 2010 Del Skrevet 10. februar 2010 Vel, det å laste inn og initialisere andre klasser enn de man strengt tatt har bruk for er en dårlig ide til å begynne med. Det du vil gjøre er å laste inn infrastrukturklassene som alle andre moduler bruker og så laste inn modulene etterhvert som du får bruk for dem. Det kan gjøres ved å se på hva som er forespurt via $_GET, $_POST og venner og så laste inn modulene som trengs for å håndtere den spørringen. Det kan også være en god ide å snøre sammen infrastrukturklassen(e) og lagre dem i $_SESSION slik at du kun trenger å sjekke at eksterne tilkoblinger fremdeles er tilgjengelig istedefor å slippe alt og begynne på nytt med en fullstendig initialisering. Lenke til kommentar
quantum Skrevet 11. februar 2010 Del Skrevet 11. februar 2010 (endret) Klasser kan ha statiske metoder også, noe som kan - eller ikke kan, alt avhengig av en hel masse som det ikke er opplyst om her - være til nytte. Eks, kvasiphp (dvs. java-aktig) class Calc { private $subtotal = 0; public int add($a, $b) { result = $a + $b; subtotal = $subtotal + $result; return $result; } public function getSubtotal() { return $subtotal; } } public class StaticCalc() { public static function add($a, $ b) { return $a + $b; } } StaticCalc trenger man ikke opprette instanser av, den er "tilstandsløs", akkurat som web'en er det. Calc samler opp totalsummen hele veien i livsløpet sitt, så den har tilstand, og det må opprettes en instans. echo StaticCalc.add(1, 2); echo StaticCalc.add(2, 3); $calc = new Calc(); echo calc.add(1, 2); echo calc.add(2, 3); echo calc.getSubtotal(); Å putte instanser av klasser i en tabell går også an, det kan f.eks. være nyttig om man lager en pool av et eller annet. Eller så har man som nevnt Singletons. Edit: phpified syntax'en. I bunn og grunn kommer vel klasselastingsproblematikken i php av at php ikke har noen classloader slik som java har. Endret 11. februar 2010 av quantum Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå