Lazy Registry Class

Door Lasse , 20 jaar geleden, 6.203x bekeken

Een Registry klasse is een klasse waarin je objecten kunt opslaan, zodat je ze ergens anders weer kunt gebruiken.
Een voorbeeld hiervan is je PDO instantie. Die is nodig bij een hoop klassen, en je wilt deze misschien niet de hele tijd doorgeven in de constructors. Je kunt dan het object via de method Registry::set($name, $object) registreren, en later weer ophalen via Registry::get($name).

Je benadert de Registry class via static methods zodat je niet steeds een referentie van de juiste instantie hoeft door te geven. Binnenin de Registry wordt via een singleton één echte instantie van Registry aangemaakt.

Met deze klasse kun je objecten ook lazy registreren. Lazy registreren houdt in dat het object dat je registreert pas echt wordt aangemaakt als je het voor het eerst gebruikt. Dit kan handig zijn als je niet zeker weet of hij gebruikt gaat worden.

Je kunt in deze Registry klasse een object lazy laten registreren door alleen de naam van de klasse en eventuele argumenten op te geven, maar ook door er nog een naam van een statische methode aan toe te voegen.

Ik hoop dat het nut van de klasse zo duidelijk is. En ik hoop dat het gebruik samen met de documentatie in de klasse ook duidelijk is.

Ik weet dat er al een hoop Registry klassen bestaan op het internet, maar ik heb er weinig gezien waarbij je classes lazy kunt registreren. Vandaar dat ik deze klasse post. Het is namelijk niet gemakkelijk om dit te implementeren. Na lang zoeken heb ik gebruik gemaakt van de Reflection API van PHP, en dat blijkt erg goed te werken.
Uiteraard is dit alleen een begin en kun je dit nog een heel eind uitbreiden en/of aan je eigen stijl aanpassen. De basis, en daarmee het lastigste is echter alvast gelegd.

Changelog:
- Clone en unserialisatie preventie weggehaald omdat het onmogelijk is om aan in instantie van Registry te komen, en het dus ook niet mogelijk is om hem te clonen of te serialiseren.
- Er voor gezorgd dat je niet een lazy object en een normaal object onder dezelfde naam kunt registreren.

Gesponsorde koppelingen

PHP script bestanden

  1. lazy-registry-class

 

Er zijn 7 reacties op 'Lazy registry class'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Storeman storeman
storeman storeman
20 jaar geleden
 
0 +1 -0 -1
TIP: Een paar regels voorbeeldcode om je mooie klasse af te maken!

Dat lazy gebeuren is best interessant, één ding vraag ik me af:

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
$instance = self::getInstance();
        if (array_key_exists($name, $instance->objects)) {
            return $instance->objects[$name];
        }
        if (array_key_exists($name, $instance->lazyObjects)) {
            $reflectionClass = new ReflectionClass($instance->lazyObjects[$name][0]);
            if (is_null($instance->lazyObjects[$name][2])) {
                $instance->objects[$name] = $reflectionClass->newInstanceArgs($instance->lazyObjects[$name][1]);
            } else {
                $instance->objects[$name] = $reflectionClass->getMethod($instance->lazyObjects[$name][2])->invokeArgs(null, $instance->lazyObjects[$name][1]);
            }
            unset($instance->lazyObjects[$name]);
            return $instance->objects[$name];
        }


Je kunt dus een set en een setLazy hebben met dezelfde naam, alleen zal die altijd de normale teruggeven, dat vind ik een beetje ondoorzichtig.
Jelmer -
Jelmer -
20 jaar geleden
 
0 +1 -0 -1
Dat is omdat het lazy loading is. Eenmaal geladen werkt het exact hetzelfde als een normaal register. Je object wordt maar 1 maal aangemaakt, of "lazy geload" *kuch*.
Lasse
Lasse
20 jaar geleden
 
0 +1 -0 -1
@storeman: Je hebt helemaal gelijk, dat bedacht ik me gisteravond toen ik de computer uitzette ook. Ik heb het aangepast.

Changelog:
- Clone en unserialisatie preventie weggehaald omdat het onmogelijk is om aan in instantie van Registry te komen, en het dus ook niet mogelijk is om hem te clonen of te serialiseren.
- Er voor gezorgd dat je niet een lazy object en een normaal object onder dezelfde naam kunt registreren.

En ik zal even kijken of ik een voorbeeldje kan maken.
Edit:
Voorbeeld toegevoegd
Bo az
Bo az
20 jaar geleden
 
Lasse
Lasse
20 jaar geleden
 
0 +1 -0 -1
@Boaz: Eerlijk gezegd had ik het idee daar vandaan. Ik moest sowieso een Registry hebben, en toe las ik daar die blog over lazy registry's. Dat leek me wel handig. Ik vind echter de implementatie daar niet echt geweldig, want je moet dus weer allerlei functies gaan schrijven, terwijl dat eigenlijk nooit nodig is (je kan namelijk ook van tevoren je config file uitlezen). Vandaar dat ik hem op deze manier heb geschreven. Ik ben van mening dat dit even flexibel is, en gemakkelijker in gebruik.
Edit:
Dank je trouwens:-)
Lode
Lode
20 jaar geleden
 
0 +1 -0 -1
het is meer een combi tussen een factory pattern en een autoloader als je het mij vraagt...
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Lasse
Lasse
20 jaar geleden
 
0 +1 -0 -1
@Lode: Ik zie hier echt geen Factory in. Een factory is bij mijn weten een class die uitzoekt welke class er moet worden aangeroepen in bepaalde contexten. Als er bijvoorbeeld settings uit een .ini bestand moeten worden gehaald, dan geeft hij automatisch een iniSettings class terug, en als het uit de db moet komen geeft hij een dbSettings class.

Ook een autoloader is dit niet, want hij included geen bestanden, en bovendien is het bedoelt om al aangemaakte objecten (lazy of niet) ergens anders in het script weer terug te geven.

Wat is volgens jouw dan een goede implementatie van een Registry?

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. lazy-registry-class

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

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.