PHP Singleton pattern

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Mark Hogeveen

Mark Hogeveen

21/01/2014 14:56:59
Quote Anchor link
Hallo,

Wat heb je aan het Singleton design pattern in OOP? Als er ook gewoon static klassen bestaan?
Een singleton klasse is ook nog eens altijd static (naar mijn weten).
Singleton is bedoeld om altijd maar 1 instantie van een klasse te kunnen maken, als er al een instantie van de singleton klasse is, wordt die bestaande instantie teruggegeven.
Wat is hier anders aan dan een gewone static class? Want van een static class kun je toch ook maar maximaal 1 instantie maken? Dus ik snap het nut niet, maar wil het wel graag begrijpen.
 
PHP hulp

PHP hulp

24/11/2024 00:03:28
 
Erwin H

Erwin H

21/01/2014 15:04:42
Quote Anchor link
Wat bedoel je met een 'static class'. Dat bestaat bij mijn weten namelijk niet, wel statische methodes binnen een class. Die maken het mogelijk om een methode binnen een class aan te maken zonder een instantie van die class te genereren. Niet 'maar een' dus, maar geen (of zoveel je wilt). Daarmee is het significant anders dan het idee van een Singleton.

Het idee van een Singleton is dat je altijd maar 1 instantie hebt en daarmee dat je geen dubbele functionaliteit/data krijgt. Zo zou het handig zijn om bijvoorbeeld maar 1 database object te hebben zodat elke database request door dat object en die connectie wordt afgehandeld. Merk op 'zou'. Het idee achter singletons en de implementatie ervan is zeer omstreden. Over het algemeen wordt het gezien als een slecht principe en iets dat je niet zou moeten gebruiken. Zie ook: http://nl.wikipedia.org/wiki/Singleton_%28ontwerppatroon%29
 
Ozzie PHP

Ozzie PHP

21/01/2014 17:26:57
Quote Anchor link
Een singleton class roep je niet aan met $class = new Class() maar met $class = Foo::getInstance(), waarbij Foo een fictieve class is. Als je de getInstance method/functie voor het eerst aanroept, maakt deze een object aan van de class Foo. Telkens wanneer je nu de class Foo gebruikt, wordt gebruik gemaakt van dit ene object. In de singleton class kun je gewoon "niet-statische" methods gebruiken. Voorbeeldje:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$db
= DB::getInstance();
$db->setQuery('SELECT foo FROM bar');
$db->executeQuery();
?>

Wat jij bedoelt met een "statische class" is waarschijnlijk een class die alleen statische methodes bevat. Dan praat je niet echt over een object, maar meer over een class met een aantal handige functies. Voorbeeldje:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$dollar
= 2;
$euro   = ConvertMoney::DollarToEuro($dollar);
$dollar = ConvertMoney::EuroToDollar($euro);
?>

Hoop dat het een beetje duidelijk is zo.
 
Dos Moonen

Dos Moonen

21/01/2014 18:25:42
Quote Anchor link
Een voordeel van een singleton ten opzichte van een 'statische classe' is dat je een de mogelijkheid hebt om dependency injection te gebruiken om een relatie tussen twee classen aan tegeven. In tegenstelling tot een een aanroep naar 'Foo::bar()' te hardcoden.
TL;DR: het is ietsjes flexibeler.
Gewijzigd op 21/01/2014 18:26:42 door Dos Moonen
 
Wouter J

Wouter J

21/01/2014 18:38:54
Quote Anchor link
Dos, je hebt door dat "singleton" en "dependency injection" elkaars grootste tegenpolen op de wereld zijn?
 
Dos Moonen

Dos Moonen

21/01/2014 20:12:40
Quote Anchor link
Hoeft niet.

Singleton is om maar één instantie van een class te krijgen.

Je kunt prima een MySQL en PostgreSQL singleton classes hebben die elk maar één instantie (en dus connectie) toe laten maar beiden de zelfde Database interface implementeren.

Voor dependency injection moet je een object doorgeven. Met een singleton heb je een object, met een statische classe niet.

Maar zelf vond ik het ook een vreemd idee toen ik het schreef :p
 
Wouter J

Wouter J

21/01/2014 20:18:30
Quote Anchor link
Dos, maar dan gaan we voorbij aan het waarom van het singleton pattern. Als we toch de database class telkens injecteren, kunnen we het net zo goed geen singleton laten zijn, aangezien we toch 1 globaal object hebben die we overal injecteren.
Het singleton pattern is juist gemaakt dat je ondanks dat je de klasse niet injecteert je toch altijd toegang krijgt tot dat ene object, doordat je met een static method werkt om het instance te verkrijgen.

En daar zien we ook meteen waarom singleton zo'n anti-pattern is tegenwoordig als je kennis hebt gemaakt met Dependency Injection. Met singletons, registeries en dat soort dingen bepaal je in de klasse wat je nodig hebt. Daardoor kun je het nooit veranderen zonder al je klassen aan te passen.
 



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.