Gå til innhold

Hvordan "starte" alle classes?


Anbefalte innlegg

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
Videoannonse
Annonse

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

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

"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 av Loomy
Lenke til kommentar

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

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 av quantum
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...