[oop] service static clas
Als ik in mijn service container een service ophaal dan wordt er een nieuwe instantie van gemaakt. Bijv. $foo = $service->get('foo'); wordt achter de schermen omgezet in $foo = new Foo();
Nu kan het heel soms eens voorkomen dat een class alleen statische functies bevat en er dus geen nieuwe instantie hoeft te worden aangemaakt. Voorbeeld:
Als ik normaal gesproken de functie bar zou willen aanroepen zou ik gewoon dit doen:
Foo::bar();
Echter, als ik een service gebruik:
Dan gebeurt er achter de schermen eigenlijk dit:
Er wordt dus een nieuwe instantie aangemaakt terwijl dat niet per se nodig is.
Bovenstaande werkt overigens wel gewoon. Als ik de service als shared instel dan wordt de instantie maar 1 keer aangemaakt, dus echt een groot probleem is het niet. Maar ik vroeg me af of iemand een idee heeft hoe je dit gemakkelijk kunt voorkomen? Ik zou aan de service een parameter kunnen meegeven waaruit blijkt dat het om een statische class gaat, maar dat betekent dat ik tegelijkertijd weer een extra controle moet inbouwen.
Of zou ik het gewoon zo laten en op de koop toenemen dat er af een toe een keer onnodig een instantie wordt aangemaakt?
Gewijzigd op 14/05/2013 20:18:52 door Ozzie PHP
En met je service container wil je zoveel mogelijk shared services hebben: 1x aanmaken en altijd die instance krijgen.
Maar in dit geval gaat het om een heel simpele class met 1 method die een array moet bewerken en weer teruggeven. In de class wordt verder ook niks opgeslagen dus het heeft lijkt mij niet echt een toegevoegde waarde om die class niet-statisch te maken. Dus vandaar mijn vraag eigenlijk. Snap je wat ik bedoel? Ik kan natuurlijk ook de betreffende method gewoon niet-statisch maken, maar ik dacht.. misschien is er nog een andere oplossing? Overigens kan het ook geen kwaad dat er een instantie wordt aangemaakt... alleen het is niet echt nodig.
Zoiets zou ik geen service laten zijn, maar gewoon aanmaken in de class.
Maar de vraag is nu wat ik zal doen. Gewoon de statische functie behouden en accepteren dat er misschien een keer een nieuwe instantie van zo'n class wordt aangemaakt? Of controle inbouwen of het een statische class betreft??? Of de specifieke method niet-statisch maken... maar klopt dat OOP technisch dan nog wel?
Blijf je echter bij de statische methode (jouw keuze), dan zou ik vanuit de service container geen object teruggeven, maar alleen de naam van de class die gebruikt moet worden. Met die naam kan je namelijk al de statische call maken:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Wat je zegt klopt precies. Ik zou inderdaad alleen de class name kunnen opvragen... alleen krijg je dan dat je de ene keer get() gebruikt en de andere keer getName(). Dat vind ik niet echt heel mooi. En wat doe je inderdaad als je de class aanpast?
Het enige wat je zou kunnen doen is in de get method de hele class nalopen en kijken of er alleen statische methodes in staan. Ja, dan de class naam teruggeven. Dit kost echter weer een hoop performance.
Kortom... ik maak de betreffende method toch maar niet statisch. Dat lijkt me de meest handige en efficiënte oplossing.
Gewijzigd op 15/05/2013 00:21:57 door Ozzie PHP
Maar dit vind ik echt, sorry dat ik het zeg, een kul reden:
"alleen krijg je dan dat je de ene keer get() gebruikt en de andere keer getName(). Dat vind ik niet echt heel mooi"
Zou je werkelijk bewust verkeerd gaan scripten omdat dat 'mooier' is? Terwijl je ook nog eens de perfecte reden hebt om verschillende functies te maken. get() geeft namelijk een object terug, getName() geeft een naam van een class terug. Dat zijn twee verschillende functionaliteiten waarvoor je dus ook gewoon twee functies zou moeten hebben. Sorry, maar dan ben je wat mij betreft echt de weg een beetje kwijt....
Dat jij een andere weg bewandelt wil geenszins zeggen dat ik de weg kwijt ben. Er zijn meerdere wegen die naar Rome leiden.
Ozzie PHP op 15/05/2013 11:39:00:
Dat mag je vinden Erwin, maar geloof me ik ben geen enkele weg kwijt. Ik wil een service ophalen en niet de naam van een service.
Dan moet je uberhaupt helemaal niet aan statische methodes denken. Dat heb je inmiddels (gelukkig) besloten, maar je gedachtengang ging er nog wel over. Daar reageerde ik op.
Oftewel, na even de weg kwijt te zijn geweest ben je weer op de goede weg beland.
Dat was ook de reden van mijn vraag... even sparren met jullie en voor je het weet zit je weer op het rechte pad ;)
Mwah, statische classes kunnen prima worden aangeroepen via een container. Gewoon eerst een instantie van de statische class maken, dmv getInstance() functie. Op die manier krijgt de definitieve statische class een eigen instantie ipv die van de container. Works like a charm, en er zijn genoeg functionaliteiten te verzinnen waarom een statische class handiger is dan niet-statische classen. Bijvoorbeeld bij meerdere plugins die worden ingeladen één statische template class.. Of de huidige gebruiker als statische object..