Hoi
.
Na af en toe wat testcases voor Webdesign, Markup & Clientside Scripting in elkaar proberen te hebben geprutst leek het me ook wel 's leuk en handig om die voor veelvoorkomende problemen / patterns in PRG / SEA te maken, zoals (de PHP code) voor een Singleton. Ik begon enthousiast aan een Singleton class, maar ik sloeg er helaas niet in een in mijn ogen ideale implementatie te realiseren. Idealiter gezien zou het in mijn ogen zo moeten werken:
Natuurlijk zou het $class probleem op te lossen door in A een
Een andere manier zou met een Factory (achtige) class zijn, maar dat vond ik ook niet helemaal bevredigend, aangezien dat, wederom, betekend dat de client op de hoogte moet zijn van het feit dat de aangeroepen class een singleton is.
Ook een Registry (achtige) class zou het kunnen oplossen, doordat je dan de classname van de beoogde class doorgeeft aan het object dat hem moet aanmaken. Maar ook dit lijkt me niet ideaal, aangezien, wederom, het voor de aanroepende class gaat boeien of het een singleton is of niet.
Of maak ik nu een enorme denkfout, en hoort die verantwoordelijkheid sowieso niet bij de singleton-zijnde class?
In de comments op php.net werd verder gesuggereerd dat het sowieso niet de bedoeling is om het te willen oplossen, aangezien singleton een pattern is, en geen class. Is dit een zinnig commentaar, of is het toch juist om het op de bovenstaande manier te willen implementeren?
Kortom: hoe kan ik het Singleton pattern het beste implementeren
.
In overleg met * Creepy in Software Engineering & Architecture geplaatst
.
Na af en toe wat testcases voor Webdesign, Markup & Clientside Scripting in elkaar proberen te hebben geprutst leek het me ook wel 's leuk en handig om die voor veelvoorkomende problemen / patterns in PRG / SEA te maken, zoals (de PHP code) voor een Singleton. Ik begon enthousiast aan een Singleton class, maar ik sloeg er helaas niet in een in mijn ogen ideale implementatie te realiseren. Idealiter gezien zou het in mijn ogen zo moeten werken:
PHP:
Ik kon echter geen bevredigende implementatie vinden. Hetgeen het meest in de buurt kwam was het volgende: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
| abstract class Singleton { /* implementation */ } class A extends Singleton { /* child functions */ } $a = new A(); $a->set_foo("bar"); echo $a->foo; /* should display bar */ $b = new A(); echo $b->foo; /* should display bar */ |
PHP:
Maar dit werkt niet, aangezien de __CLASS__ constant in Singleton verwijst naar Singleton zelf, en niet naar het aangeroepen child A.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| abstract class Singleton { private $instance; protected final function __construct() { if(method_exists($this, "construct")) { $this->construct(); } } public static function get_instance() { if(!isset(self::$instance)) { $class = __CLASS__; /* This creates the problem, as it refers to the Singleton class, instead of the A class */ self::$instance = new $class; } return self::$instance; } } class A extends Singleton { private $a; public function set($a) { $this->a = $a; } public function output() { echo $this->a; } } $a = A::get_instance(); $a->set("foo"); $a->output(); /* Should output foo */ $b = A::get_instance(); $b->output(); /* Should output foo */ |
Natuurlijk zou het $class probleem op te lossen door in A een
protected $class="A";
op te nemen. Ook zou je door een get_instance function op te nemen, met daarin parent::get_instance(__CLASS__);
in het singleton child (A), en de get_instance method in de parent om te bouwen naar een die een $class argument accepteert. Maar dat lijkt me beide niet echt gewenst, aangezien je dan een deel van hetgeen je met de parent class wil realiseren verplaatst naar de child.Een andere manier zou met een Factory (achtige) class zijn, maar dat vond ik ook niet helemaal bevredigend, aangezien dat, wederom, betekend dat de client op de hoogte moet zijn van het feit dat de aangeroepen class een singleton is.
Ook een Registry (achtige) class zou het kunnen oplossen, doordat je dan de classname van de beoogde class doorgeeft aan het object dat hem moet aanmaken. Maar ook dit lijkt me niet ideaal, aangezien, wederom, het voor de aanroepende class gaat boeien of het een singleton is of niet.
Of maak ik nu een enorme denkfout, en hoort die verantwoordelijkheid sowieso niet bij de singleton-zijnde class?
In de comments op php.net werd verder gesuggereerd dat het sowieso niet de bedoeling is om het te willen oplossen, aangezien singleton een pattern is, en geen class. Is dit een zinnig commentaar, of is het toch juist om het op de bovenstaande manier te willen implementeren?
Kortom: hoe kan ik het Singleton pattern het beste implementeren
In overleg met * Creepy in Software Engineering & Architecture geplaatst