Forum › PHP / SQL › Topic
[PHP/SQL] OOP mysqli connectie meenemen.
Beste WMcityérs
Al lange tijd ben ik aan het knoeien met het doorlussen van de opgezette connectie met mysql naar een andere class.
Stel als voorbeeld.
In klasse system heb ik een db connectie geopend. Maar die wil ik in klasse nieuws hergebruiken. hoe kan ik dit doen?
Kort omschreven maar wel duidelijk neem ik aan?
ZiraX.
Al lange tijd ben ik aan het knoeien met het doorlussen van de opgezette connectie met mysql naar een andere class.
Stel als voorbeeld.
In klasse system heb ik een db connectie geopend. Maar die wil ik in klasse nieuws hergebruiken. hoe kan ik dit doen?
Kort omschreven maar wel duidelijk neem ik aan?
ZiraX.
Hoi ZiraX,
Wat je zou kunnen overwegen is een singleton class waarin je een database connectie opbouwt en returnt. Indien er al een connectie is, geeft hij je gewoon de al bestaande verbinding terug. De class kun je dan in al je andere classes hergebruiken.
(Niet getest, dus er zou een foutje in kunnen zitten).
Het idee is het volgende: de instantie van Database wordt bijgehouden in de klasse zelf. Indien er nog geen instantie bestaat, maakt hij deze aan en returnt hij 'm. Indien hij al een instantie heeft wordt hij simpelweg gereturned. Je werkt dus de gehele request met dezelfde connectie. Als je hier meer over wil lezen verwijs ik je graag naar Wikipedia:
http://nl.wikipedia.org/wiki/Singleton_(informatica)
Naast mysqli kun je ook eens een kijkje nemen naar PDO, als je dan toch met OOP bezig bent
Het bovenstaande voorbeeld pas je zo toe trouwens:
Succes!
Erik
Wat je zou kunnen overwegen is een singleton class waarin je een database connectie opbouwt en returnt. Indien er al een connectie is, geeft hij je gewoon de al bestaande verbinding terug. De class kun je dan in al je andere classes hergebruiken.
![]() | Code | ![]() | ![]() | ![]() |
|
(Niet getest, dus er zou een foutje in kunnen zitten).
Het idee is het volgende: de instantie van Database wordt bijgehouden in de klasse zelf. Indien er nog geen instantie bestaat, maakt hij deze aan en returnt hij 'm. Indien hij al een instantie heeft wordt hij simpelweg gereturned. Je werkt dus de gehele request met dezelfde connectie. Als je hier meer over wil lezen verwijs ik je graag naar Wikipedia:
http://nl.wikipedia.org/wiki/Singleton_(informatica)
Naast mysqli kun je ook eens een kijkje nemen naar PDO, als je dan toch met OOP bezig bent

Het bovenstaande voorbeeld pas je zo toe trouwens:
![]() | Code | ![]() | ![]() | ![]() |
|
Succes!
Erik
In principe moet ik dus al mijn bestaande klasses met de database klasse extenden?
Ben sinds kort pas bezig trouwens met OOP programmeren, echter gebruik ik elke keer een nieuwe mysqli connectie per klas, wat toch een hevige verzwaring van het script betekend. Omdat je elke keer een nieuwe connectie oproept.
Ben sinds kort pas bezig trouwens met OOP programmeren, echter gebruik ik elke keer een nieuwe mysqli connectie per klas, wat toch een hevige verzwaring van het script betekend. Omdat je elke keer een nieuwe connectie oproept.
Even een kleine toevoeging. Sorry voor de BUMP, maar vond het wat makkelijker om een overzicht te hebben.
Op het moment heb ik het als volgt:
system.class.php
news.class.php
Op deze manier werkt het wel, maar ik heb het gevoel dat het niet de juiste manier is, kan iemand me meer toelichten op bovenstaand?
Op het moment heb ik het als volgt:
system.class.php
![]() | Code | ![]() | ![]() | ![]() |
|
news.class.php
![]() | Code | ![]() | ![]() | ![]() |
|
Op deze manier werkt het wel, maar ik heb het gevoel dat het niet de juiste manier is, kan iemand me meer toelichten op bovenstaand?
Zijn er hier weinig mensen met kennis van OOP, of die hun tips willen delen etc. ?
Zou wel fijn zijn om hierom wat activiteit te creeëren.. Zo lok je namelijk ook mensen
Zou wel fijn zijn om hierom wat activiteit te creeëren.. Zo lok je namelijk ook mensen
ZiraX,
Als ik jou was, zou ik even goed kijken naar welke classes je gaat maken. Is 'news' namelijk een 'system' ? Want dat suggereer je nu namelijk. Ik weet niet hoe of wat je applicatie wordt, maar zo iets zou mij zelf logischer lijken:
Again, niet getest ;-) Maar wat ik meer probeer te zeggen is, probeer je classes te abstraheren. Een stukje wat ik ooit eens in een boek gelezen heb van Bob C. Martin (Clean Code) is dat een class maar 1 reden moet hebben om te veranderen. Dus, als een class meerdere doelen heeft dan doet het te veel. Je system class doet nu zoiezo al meerdere dingen, namelijk output geven (of wat ik me er ook bij moet voorstellen) en de database connectie beheren.
Probeer dus even goed na te denken over welke classes je maakt. Vaak wordt er bij dit proces gebruik gemaakt van Noun Phrase Identification. Daarbij leg je het systeem in verhaalvorm uit en ga je alle zelfstandig naamwoorden onderstrepen, markeren of wat je ook fijn vindt. Als je dit gedaan hebt ga je kijken wat goede kandidaten voor classes zijn. Laat ik bijvoorbeeld een voorbeeld als dit nemen:
Daar haal je als zelfstandig naamwoorden Karakters, Goblin, Elf, Knight en Aanval uit. Zorg wel dat je alle zelfstandig naamwoorden enkelvoud maakt, want een instantie is een representatie van 1 'iets'.
In dit geval lijken ze me allemaal prima kandidaten voor classes. HP en Mana lijken prima kandidaten om variabelen in Karakter te zijn, omdat het iets is wat alle classes hebben. Als Goblin, Elf en Knight een subtype zijn van Karakter is dit precies wat je wil. Daarnaast hadden ze alle 3 nog een 'speciale aanval', dat zouden typische methoden zijn die per subclass vastgelegd worden. Als je dit proces een paar keer gedaan hebt begint het wel te dagen en kom je op nagenoeg hetzelfde uit als je gewoon gaat denken ipv alles in verhaalvorm uitschrijven en dan markeren.
Goed, tot slot nog even over de scope van variabelen, ik zie dat je alles public maakt. Geen probleem hoor, want het zal vast wel werken; maar toch wil ik even uitleggen wat hier het idee achter is.
Public variabelen / methoden zijn overal te benaderen. Dus ook vanuit andere classes. Private variabelen / methoden zijn enkel vanuit de class zelf te benaderen. Protected vanuit de class zelf en alle subclasses.
Goed, ik heb genoeg getypt; hopelijk heb je er iets aan. OOP is niet gemakkelijk en je moet er wel echt je draai in vinden. Ik werk er nu enige tijd mee in onder andere PHP Java en Ruby en leer nog dagelijks bij dus neem de tijd ;-)
Succes!
Erik
p.s. mocht je een of ander online systeem willen maken, heb je overwogen om een bestaand framework te gebruiken? Dan heb je namelijk gelijk een goede basis.
Als ik jou was, zou ik even goed kijken naar welke classes je gaat maken. Is 'news' namelijk een 'system' ? Want dat suggereer je nu namelijk. Ik weet niet hoe of wat je applicatie wordt, maar zo iets zou mij zelf logischer lijken:
![]() | Code | ![]() | ![]() | ![]() |
|
Again, niet getest ;-) Maar wat ik meer probeer te zeggen is, probeer je classes te abstraheren. Een stukje wat ik ooit eens in een boek gelezen heb van Bob C. Martin (Clean Code) is dat een class maar 1 reden moet hebben om te veranderen. Dus, als een class meerdere doelen heeft dan doet het te veel. Je system class doet nu zoiezo al meerdere dingen, namelijk output geven (of wat ik me er ook bij moet voorstellen) en de database connectie beheren.
Probeer dus even goed na te denken over welke classes je maakt. Vaak wordt er bij dit proces gebruik gemaakt van Noun Phrase Identification. Daarbij leg je het systeem in verhaalvorm uit en ga je alle zelfstandig naamwoorden onderstrepen, markeren of wat je ook fijn vindt. Als je dit gedaan hebt ga je kijken wat goede kandidaten voor classes zijn. Laat ik bijvoorbeeld een voorbeeld als dit nemen:
Quote:
Er zijn drie typen karakters, Goblin, Elf en Knight. Elk karakter heeft levenspunten en mana. Ook hebben ze allemaal een speciale aanval: een Goblin heeft X, een Elf Y en een Knight Z.
Daar haal je als zelfstandig naamwoorden Karakters, Goblin, Elf, Knight en Aanval uit. Zorg wel dat je alle zelfstandig naamwoorden enkelvoud maakt, want een instantie is een representatie van 1 'iets'.
In dit geval lijken ze me allemaal prima kandidaten voor classes. HP en Mana lijken prima kandidaten om variabelen in Karakter te zijn, omdat het iets is wat alle classes hebben. Als Goblin, Elf en Knight een subtype zijn van Karakter is dit precies wat je wil. Daarnaast hadden ze alle 3 nog een 'speciale aanval', dat zouden typische methoden zijn die per subclass vastgelegd worden. Als je dit proces een paar keer gedaan hebt begint het wel te dagen en kom je op nagenoeg hetzelfde uit als je gewoon gaat denken ipv alles in verhaalvorm uitschrijven en dan markeren.
Goed, tot slot nog even over de scope van variabelen, ik zie dat je alles public maakt. Geen probleem hoor, want het zal vast wel werken; maar toch wil ik even uitleggen wat hier het idee achter is.
Public variabelen / methoden zijn overal te benaderen. Dus ook vanuit andere classes. Private variabelen / methoden zijn enkel vanuit de class zelf te benaderen. Protected vanuit de class zelf en alle subclasses.
Goed, ik heb genoeg getypt; hopelijk heb je er iets aan. OOP is niet gemakkelijk en je moet er wel echt je draai in vinden. Ik werk er nu enige tijd mee in onder andere PHP Java en Ruby en leer nog dagelijks bij dus neem de tijd ;-)
Succes!
Erik
p.s. mocht je een of ander online systeem willen maken, heb je overwogen om een bestaand framework te gebruiken? Dan heb je namelijk gelijk een goede basis.



Offline



