[oop] waarom geen warning/notice?
Zie dit codevoorbeeld: 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??
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??
Omdat PHP nou eenmaal zou werkt...
Iets uitgebreider, statische functies kun je in PHP als instance functies aanroepen, maar instance functies niet als statische functies.
Iets uitgebreider, statische functies kun je in PHP als instance functies aanroepen, maar instance functies niet als statische functies.
Aha, oké... dat wist ik niet.
Dus om te voorkomen dat ik (per ongeluk) een statische class ga initialiseren, is dus de enige oplossing om een private constructor te maken?
Dus om te voorkomen dat ik (per ongeluk) een statische class ga initialiseren, is dus de enige oplossing om een private constructor te maken?
Waarom zou je dat niet willen? Ga niet je hele applicatie dicht bouwen...
"A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools." -Douglas Adams
"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)?
Wat Wouter bedoelt is dat PHP geen statische classes heeft op een manier zoals bijvoorbeeld in C#. Je kan in PHP een class niet markeren als 'static' maar members en methods wel. (zie: http://php.net/manual/en/language.oop5.static.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.
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...
Yup... 't is een magische autoloader :D
(alleen mijn default autoloader doet dit overigens, de PSR varianten doen dit niet)
(alleen mijn default autoloader doet dit overigens, de PSR varianten doen dit niet)
Dan doe je echt iets goed verkeerd. In PHP heeft elke klasse maar 1 functie, je autoloader laad nu klassen in en initialiseerd klassen. Daarnaast bepaald hij dus ook nog het type klasse. Dat is veel te veel voor een autoloader.
Een autoloader hoort alleen te laden, meer niet. De rest is de verantwoordelijkheid van andere klassen.
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.
Ozzie, dan is er nog een mogelijkheid: je kunt de configuratie van een klasse eenmalig inladen zonder de klasse zelf te laden. Dat is eigenlijk ook wat er gebeurt met configuratie-instellingen in php.ini.
Als je die "static" klasse abstract maakt, werken de static methoden overigens ook nog steeds. Dat lijkt me dan de elegantste work-around.
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
Ward, ik denk niet dat dat lukt.
Stel ik heb deze class:
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.
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....




