[oop] service static clas

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ozzie PHP

Ozzie PHP

14/05/2013 20:17:39
Quote Anchor link
Ola,

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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
class Foo {

   static public function bar() {
      echo 'hoi';
   }

}

?>

Als ik normaal gesproken de functie bar zou willen aanroepen zou ik gewoon dit doen:
Foo::bar();

Echter, als ik een service gebruik:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$foo
= $services->get('foo');
$foo::bar();
?>

Dan gebeurt er achter de schermen eigenlijk dit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$foo
= new Foo();
$foo::bar();
?>

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
 
PHP hulp

PHP hulp

28/11/2024 01:30:52
 
Wouter J

Wouter J

14/05/2013 20:20:32
Quote Anchor link
En zie hier nog een argument om geen statics te gebruiken :)

En met je service container wil je zoveel mogelijk shared services hebben: 1x aanmaken en altijd die instance krijgen.
 
Ozzie PHP

Ozzie PHP

14/05/2013 20:25:25
Quote Anchor link
Hoi Wouter, ja klopt :)

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

Wouter J

14/05/2013 20:26:22
Quote Anchor link
Zoiets zou ik geen service laten zijn, maar gewoon aanmaken in de class.
 
Ozzie PHP

Ozzie PHP

14/05/2013 20:31:02
Quote Anchor link
Dat zou kunnen, maar ik wil niet dat een class een andere voorgedefinieerde/hardcoded class kan aanmaken. Ik wil dat al m'n classes in de service container staan (kwestie van persoonlijke voorkeur).

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?
 
Erwin H

Erwin H

15/05/2013 00:16:20
Quote Anchor link
Als eerste zou ik ook proberen geen statische methodes te hebben en ook al is het niet perse nodig, toch gewoon een object terug te geven en daarmee te werken. Geeft je veel meer flexibiliteit mocht je die class later nog eens willen veranderen.

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
//class met de statische method
class Bar_Class{
  static public function doeIets(){
    //bla bla bla
  }
}


//service container
class Foo_Container{
  public function getBarName(){
    return 'Bar_Class';
  }
}


//aanroep ergens in een andere class
$class = $serviceContainerObj->getBarName();
$class::doeIets();
?>
 
Ozzie PHP

Ozzie PHP

15/05/2013 00:21:42
Quote Anchor link
Hey Erwin,

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
 
Erwin H

Erwin H

15/05/2013 08:21:58
Quote Anchor link
Disclaimer: ik denk dat het niet statisch maken de beste oplossing is.

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

Ozzie PHP

15/05/2013 11:39:00
Quote Anchor link
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. Tis maar net waar je de voorkeur aan geeft. Bovendien heb ik een probleem als ik niet-statische functies ga toevoegen aan de betreffende service.

Dat jij een andere weg bewandelt wil geenszins zeggen dat ik de weg kwijt ben. Er zijn meerdere wegen die naar Rome leiden.
 
Erwin H

Erwin H

15/05/2013 11:47:18
Quote Anchor link
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.
 
Ozzie PHP

Ozzie PHP

15/05/2013 11:50:04
Quote Anchor link
Dat was ook de reden van mijn vraag... even sparren met jullie en voor je het weet zit je weer op het rechte pad ;)
 
Chris -

Chris -

15/05/2013 11:52:14
Quote Anchor link
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..
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.