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??
Yup... 't is een magische autoloader :D

(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.
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.
Ward, ik denk niet dat dat lukt.

Stel ik heb deze class:

<?php

class color {

const blue = 1;
const red = 2;

static private $reversed;

}
?>
De gedachtengang is dat ik in de statische $reversed property de constanten omgedraaid wil opslaan, dus zo:


[reversed]
   1 => blue
   2 => red

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....

Reageren