class maar 1x
Ik heb een Application class met uitsluitend statische functies. In deze class wordt de complete applicatie opgebouwd. Van deze class mag geen instantie worden gemaakt (de applicatie moet immers maar 1x worden opgebouwd).
Hoe kan ik nu bereiken dat er van die class geen instantie wordt gemaakt? Ik heb er nu een abstract class van gemaakt met statische functies. Dit werkt wel, maar is dit de juiste manier? Of kan ik er beter een normale class van maken en dan een singleton implementeren?
Ik vraag me wel af of je dit echt wilt... (sterker nog, lijkt me onverstandig...)
Bijv.: Een lijst met gebruikers, kan je geen class 'User' meer gebruiken, dus moet je weer alles met arrays gaan klooien.
Misschien is het een goed idee om eens een goed boek over OO te lezen, waarin ook voor- en nadelen van bijv. statics staan beschreven. Inheritance en Design by Contract komen dan waarschijnlijk ook langszij. Dit zijn een paar voorbeelden van belangrijke onderwerpen in OO.
"Door de class zelf ook static te maken."
Hoe maak je een class static?
static class MijnClass ??
http://nl.php.net/manual/en/language.oop5.static.php
(deze had je vast al wel gelezen.. toch????, zo niet, RTFM!!!)
Static Class ondersteund PHP dus blijkbaar niet.
Dan zal je iets moeten maken als een soort van SingleTon Constructor.
(deze had je vast al wel gelezen.. toch????, zo niet, RTFM!!!)
Static Class ondersteund PHP dus blijkbaar niet.
Dan zal je iets moeten maken als een soort van SingleTon Constructor.
Code (php)
Gewijzigd op 18/02/2012 02:40:42 door - Jim -
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
class MijnClass
{
//Private zodat vanaf buiten niet aangeroepen mag worden
private function __construct()
{
}
private function __clone()
{
}
}
{
//Private zodat vanaf buiten niet aangeroepen mag worden
private function __construct()
{
}
private function __clone()
{
}
}
En een abstracte statische class? Ik mag aannemen dat je die dan ergens extend? Want een abstracte class kun je toch niet direct gebruiken?
Daarom kun je het ook gebruik als hij abstract is.
@Ozzie, ik zou er een singleton van maken. Meer informatie: http://php.net/language.oop5.patterns.php#language.oop5.patterns.singleton
Gewijzigd op 18/02/2012 11:36:13 door Wouter J
Wouter J op 18/02/2012 10:20:46:
@Dillen, van een abstract class kun je geen instance maken. Maar een class met allemaal static methods en properties is eigenlijk niet echt een class. Static properties zijn eigenlijk een soort global variabele en static methods zijn gewoon functies die een leuk classnaampje voor hun hebben. Eigenlijk is een class met allemaal static dingen geen echt class, maar gewoon een leuke verzameling global variabelen en functies.
Daarom kun je het ook gebruik als hij abstract is.
Daarom kun je het ook gebruik als hij abstract is.
Dan snap ik het, bedankt ;)
Maar dan is ook gelijk je hele OOP structuur weg.. Dan kun je er inderdaad beter een Singleton van maken. Of zoals al gezegd een Factory class die je website aan maakt.
Of je maakt gebruik van Dependency Injection ligt er net even aan wat/hoe je het wil!
Mijn voorkeur gaat voor de singleton pattern. Maar ga zeker de afwegingen maken om dit te gebruiken, kan in later stadium misschien in 1x heel onhandig worden :)
Front controller pattern.
Volgens mij zoekt Ozzie gewoon het Gewijzigd op 18/02/2012 12:24:12 door Niels K
Haha Niels je haalt echt de woorden uit mijn mond. Toen ik Ozzie zijn vraag/bedoeling las dacht 'Jij bent gewoon op zoek naar het FrontController pattern' haha
Haha :-) Dat is de laatste tijd wel vaker voorgekomen ;-) Mooi dat we iig op één lijn zitten.
Daarnaast is een Application class niet erg (mits je deze goed implementeert) maar dat was op dit moment niet het oplossing van zijn probleem.
voorbeeldje van een frontcontroller bekeken en feitelijk lijkt dit wel op mijn Application class. Mijn application class voert alle benodigde handelingen voor een pagina request uit. Dus bijv. de settings worden ingeladen, de route wordt naar een router gestuurd die de juiste action en controller teruggeeft. En uiteindelijk wordt de pagina dan opgebouwd. Alleen ik noem het dus geen frontcontroller maar een Application. Maar... wat mijn vraag dus was / is... die Application die mag per pagina request maar 1x worden gebruikt. Immers je gaat niet tijdens 1 pagina request je pagina 2x opbouwen. Hoe kan ik voorkomen dat er meerdere instanties van de Application worden gemaakt? Ik wil dus dat die Application class slechts 1x gebruikt kan worden en daarna niet meer. Nou zo kwam ik er dus bij om de functies statisch te maken en de class abstract, zodat je niet kunt zeggen $application = new Application. Maar wellicht kan ik ook gewoon afvangen of de class al eens gebruikt is en als iemand de class opnieuw aanroept een Exception throwen? Bijv. zoiets?
$application = new Application(); // dit gaat goed
$application2 = new Application(); // dit gaat fout, er wordt eeen Exception gegooid.
Of je zou ook alleen statische functies kunnen gebruiken, waarbij je de class wel abstract maakt (zodat je geen nieuwe instantie kunt aanmaken) en dat je dan de "start" functie public maakt en alle andere functies private en dat je dan in de start functie weer een check uitvoert. Dus hetzelfde principe als het vorige voorbeeld, maar dan met statische functies en een abstracte class, zodat de Application niet opnieuw kan worden aangemaakt. Zoiets:
Wat is de beste manier?
Ik heb even een Code (php)
$application = new Application(); // dit gaat goed
$application2 = new Application(); // dit gaat fout, er wordt eeen Exception gegooid.
Of je zou ook alleen statische functies kunnen gebruiken, waarbij je de class wel abstract maakt (zodat je geen nieuwe instantie kunt aanmaken) en dat je dan de "start" functie public maakt en alle andere functies private en dat je dan in de start functie weer een check uitvoert. Dus hetzelfde principe als het vorige voorbeeld, maar dan met statische functies en een abstracte class, zodat de Application niet opnieuw kan worden aangemaakt. Zoiets:
Code (php)
Wat is de beste manier?
Gewijzigd op 18/02/2012 15:58:42 door Ozzie PHP
Ik zou de eerste gebruiken, als zou ik wel een LogicException gebruiken, of misschien wel een BadMethodCallException of een eigen exception maken.
Oké,dan ga ik voor de 1e optie. Ik heb besloten om alleen Exceptions te throwen als er iets mis gaat waardoor de applicatie moet stoppen. Ik heb een eigen Exception class. Nu nog heel simpel, maar die ga ik nog uitbreiden. Als er iets fout gaat als een bezoeker de site bezoekt dan toon ik een nette melding en mail ik de melding naar mezelf. Als er iets fout gaat in ontwikkel mode dan zie ik de foutmelding op m'n scherm.
Offtopic:
En een fout mailen ben ik niet zo'n voorstander van. Stel dat je 100 bezoekers per dag hebt en er zit een fout op in de Home controller. Dan krijg je dus 100 mailtjes, nog niet meegerekend dat mensen de pagina gaan refreshen.
Dat van die mail is overigens wel een goede. Maar je moet toch weten dat er iets fout gaat? Je zou in je database kunnen bijhouden of een bepaalde melding al verstuurd is... maar als je database het niet doet gaat dat niet werken. Je zou eventueel in een bestandje kunnen bijhouden of de melding verstuurd is, maar wellicht zijn er nog betere oplossingen? Hoe dan ook, als er iets op de site fout gaat dan lijkt het me toch dat je een mailtje moet ontvangen...
function.error-log doen, maar je kan ook een mooie log class maken (zie het topic 'logging clas opbouwen' en dan het antwoord van Jelmer).
In de log class kan je dan controleren of de laatste regel dezelfde fout is en als dat niet zo is kun je een mailtje sturen.
Fouten moet je altijd loggen in bestanden en niet in een db. Verder zou ik op het admin panel de mogelijkheid maken tot het uitlezen van deze log bestanden.
Ik zou de bestanden loggen in een bestandje. Dat kan je via In de log class kan je dan controleren of de laatste regel dezelfde fout is en als dat niet zo is kun je een mailtje sturen.
Fouten moet je altijd loggen in bestanden en niet in een db. Verder zou ik op het admin panel de mogelijkheid maken tot het uitlezen van deze log bestanden.
Heb je een link naar dat topic? De zoekfunctie laat me weer in de steek...