Classes

Tags:    php

<< < 12 > >>
Hej alle sammen.

Jeg står med et ret stort problem, som jeg nu gennem lang tid har prøvet at finde en løsning på, uden held. Derfor håber jeg på at en eller flere herinde kan hjælpe mig lidt på vej mod en løsning.

Lad os starte med et lille kode eksempel:
Fold kodeboks ind/udPHP kode 


Som I kan se, så ønsker jeg at lave en masse overordnet classes som jeg kan bruge på mange forskellige projekter.
Disse classes "hentes" så i en ny class som er lavet specielt til det projekt som jeg arbejder med. Denne class indeholder de classes som hjemmesiden skal kunne benytte.

Mit problem opstår så, at mine overordnet classes ikke helt forstår at de er en del af en stor class ("MyWebSite_Com"), og derfor kan jeg ikke bruge de forskellige funktioner på kryds og på tværs.

Jeg ved ikke om min ide, er den mest optimale måde at benytte class idéen på, så har du et bedre forslag, så sig endelig frem :)



Indlæg senest redigeret d. 14.01.2009 17:54 af Bruger #8254
11 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 5 karma
Sorter efter stemmer Sorter efter dato
Du kunne også formentlig sender instansen af db klassen til blog instansen i dennes construktor og så gemme en reference til db instansen i blog instansen.
Fold kodeboks ind/udKode 


Kan ikke se at det ikke skulle virke, ellers kan du i mit tidligere eksempel i stedet for at implementer ShowAllPosts i MyWebSite_Com klassen i stedetskrive:
$cms = new MyWebSite_Com;
$cms->blog->ShowAllPosts($cms->database);

I øvrigt ville jeg foreslå at du lavet din database klassen sådan at den indkapsuleret al mysql kode så du i de klasser der skal bruge den ikke skal skrive mysql kald.
f.eks lave en query funktion der dækker over mysql_query funktionen.



Det du skal gøre er at du i den MyWebSite_Com skal lave nogen funktioner der returnere henholdsvis dit blog objekt og dit database objekt.
Fold kodeboks ind/udKode 

Jeg garantere ikke at det virker. Det er muligt du skal ændre navnene på funktionerne.



Tak for det hurtige svar, Emil.

Kan jeg få dig til at lave lidt om i min kode, og vise mig hvad jeg så skal gøre i de overordnet classes, for at få dem til at virke?



du kan sende database variablen til blog variablen.

f.eks. hvis du lavede en funktion

public function ShowAllPosts(){
$this->blog->ShowAllPosts($this->database);
}
i my website klassen, så ville du kunne referer til database variablen i blog klassens ShowAllPosts
function ShowAllPosts($db){
//Samme problem, som beskrevet neden under. Hvordan får jeg lov til at bruge den mysql connection som er defineret i "MyWebSite_Com"?
$query = mysql_query("SELECT * FROM blog_posts ORDER BY date", $db->connection);
while($info = mysql_fetch_assoc($query))
echo $info['title'] . '<br />';
}




du kan sende database variablen til blog variablen.

f.eks. hvis du lavede en funktion

public function ShowAllPosts(){
$this->blog->ShowAllPosts($this->database);
}
i my website klassen, så ville du kunne referer til database variablen i blog klassens ShowAllPosts
function ShowAllPosts($db){
//Samme problem, som beskrevet neden under. Hvordan får jeg lov til at bruge den mysql connection som er defineret i "MyWebSite_Com"?
$query = mysql_query("SELECT * FROM blog_posts ORDER BY date", $db->connection);
while($info = mysql_fetch_assoc($query))
echo $info['title'] . '<br />';
}


Det ville jo betyde at jeg skulle lave sådan en public funktion for alle funktioner i alle klasserne. Så ryger hele pointen med at spare tid ;)



Fold kodeboks ind/udKode 


Det er en idé. Men det er ikke rigtig nogen god metode, da det er ulogisk hvor "Blog" kommer fra.

Ellers må du ud og kigge på __autoload
Fold kodeboks ind/udKode 




Indlæg senest redigeret d. 14.01.2009 19:55 af Bruger #10216
Hvad med et singleton til at nå den samme database adgang i alle klasser?



Michael:
Din første er, som du selv siger, desværre for ulogisk og kan derfor ikke helt bruges i denne sammenhæng :(

Din anden ide kan jeg desværre ikke helt se hvordan skal virke i praksis...

Martin:
Hvad med et singleton til at nå den samme database adgang i alle klasser?

Kan du give et par kode eksempler på hvad du mener?



Følgende er en singleton klasse

Fold kodeboks ind/udPHP kode 


Nu skulle du i f.eks. din blog klasse få adgang til den.

Fold kodeboks ind/udPHP kode 


Det er ikke blevet testet.



Indlæg senest redigeret d. 16.01.2009 16:13 af Bruger #6559
Du kunne også formentlig sender instansen af db klassen til blog instansen i dennes construktor og så gemme en reference til db instansen i blog instansen.
Fold kodeboks ind/udKode 


Kan ikke se at det ikke skulle virke, ellers kan du i mit tidligere eksempel i stedet for at implementer ShowAllPosts i MyWebSite_Com klassen i stedetskrive:
$cms = new MyWebSite_Com;
$cms->blog->ShowAllPosts($cms->database);

Det var også den måde jeg er kommet frem til, efter at have prøvet mig lidt frem :)

I øvrigt ville jeg foreslå at du lavet din database klassen sådan at den indkapsuleret al mysql kode så du i de klasser der skal bruge den ikke skal skrive mysql kald.
f.eks lave en query funktion der dækker over mysql_query funktionen.

Det har jeg også arbejdet lidt med, dog ikke for alle mysql funktionerne. Bør jeg gøre det for alle de mysql funktioner som jeg benytter mig af?



<< < 12 > >>
t