[oop] waarom geen warning/notice?
http://3v4l.org/XcH5I
Waarom komt er geen melding als ik een statische functie op een niet-statische manier aanroep?
Als ik een array-key opvraag die niet bestaat, volgt er een notice dus error reporting staat aan.
Ik zou verwachten dat je een statische functie altijd statisch moet aanroepen??
Zie dit codevoorbeeld: Waarom komt er geen melding als ik een statische functie op een niet-statische manier aanroep?
Als ik een array-key opvraag die niet bestaat, volgt er een notice dus error reporting staat aan.
Ik zou verwachten dat je een statische functie altijd statisch moet aanroepen??
Iets uitgebreider, statische functies kun je in PHP als instance functies aanroepen, maar instance functies niet als statische functies.
Dus om te voorkomen dat ik (per ongeluk) een statische class ga initialiseren, is dus de enige oplossing om een private constructor te maken?
"A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools." -Douglas Adams
Ik snap wat je bedoelt. Maar ik maak dus bewust een statische class, met als bedoeling dat die altijd statisch wordt aangeroepen. En dan blijkt dat je 'm gewoon kunt instantiëren en vanuit de instance de statische functies kunt aanroepen. Dat vind ik maar vaag :(
Statische klassen bestaan niet in PHP.
Hoe bedoel je Wouter? Een class met alleen statische methods is toch een statische class (eventueel met private constructor)?
Nee, dan heb je alsnog een normale class, maar dan met statische methods. Als PHP wel statische klassen had, dan had ie wel betere gesupport gehad voor bijv. het initializen van de statische klasse.
Ah oké... ik heb een autoloader die "statische" classes kan initialiseren :)
Dan doet jouw autoloader veel meer dan loaden...
(alleen mijn default autoloader doet dit overigens, de PSR varianten doen dit niet)
Een autoloader hoort alleen te laden, meer niet. De rest is de verantwoordelijkheid van andere klassen.
Is een keuze Wouter. Het is een handigheidje waardoor ik statische classes automatisch kan initialiseren, net zoals niet-statische classes automatisch worden geconstruct. Op het moment dat een class in gebruik wordt genomen, moet ie gebruiksklaar worden gemaakt. Anders kun je de class niet op een geldige manier gebruiken. Je zou het initialiseren dus kunnen zien als onderdeel van het laden.
Wacht even, een statische klasse die gebruiksklaar gemaakt moet worden? Dat kan niet. Static betekend dat ze niet afhankelijk zijn van een instance of wat dan ook. In andere woorden: static klassen zijn altijd klaar voor uitvoeren. Static klassen zijn niet meer dan losse functies groeperen.
En toch (hoewel het niet vaak zal voorkomen) kan er zich een situatie voordoen waarin je een statische class wilt initialiseren. Ik heb een statische class waarbij ik iets met de class constants moet doen, voordat je de class kunt gebruiken. Nu kan ik telkens als ik een method in die class aanroep controleren of die handeling al is uitgevoerd, of ik initialiseer de class eenmalig bij het inladen.
Als je die "static" klasse abstract maakt, werken de static methoden overigens ook nog steeds. Dat lijkt me dan de elegantste work-around.
Gewijzigd op 04/07/2014 14:58:40 door Ward van der Put
Stel ik heb deze class:
Code (php)
De gedachtengang is dat ik in de statische $reversed property de constanten omgedraaid wil opslaan, dus zo:
Hiervoor gebruik ik de initialisatie method (in een abstracte parent class).
>> je kunt de configuratie van een klasse eenmalig inladen zonder de klasse zelf te laden.
Dat lijkt me niet mogelijk.
Ozzie, dan doe je zoiets de eerste keer dat je een method aanroept. Zoiets hoor je niet in een autoloader te regelen.
Wouter, dat zou kunnen, maar dan moet ik telkens als ik een method aanroep een controle gaan uitvoeren. Da's ook niet echt chique toch? :-(
Het zorgt er wel voor dat overal waar je die statische classe gebruikt je afhankelijk bent van die specifieke autoloader....