LRegistry – PHP Lazy Registry Class
Op internet zijn enkele interessante artikelen geschreven over het “lazy” registreren van objecten. Lazy registreren wil zeggen dat er pas een instantie wordt gemaakt als deze voor het eerst wordt opgevraagd (bijvoorbeeld met de “get” methode). Als deze tijdens het uitvoeren niet wordt opgevraagd, hoeft er dus ook géén instantie gemaakt te worden. Veel efficiënter dus.
Lazy Class
Het toevoegen van een klasse op de “lazy” manier kan bijvoorbeeld met de code:
LRegistry::set_lazy_class( 'db', 'DBConnection' );
Er is nu een waarde met de key “db” toegevoegd, die de klasse “DBConnection” bevat. Pas wanneer deze wordt opgevraagd, zal er een instantie van “DBConnection” worden gemaakt.
// when getting "db" for the first time // the instance will be created LRegistry::get( 'db' );
Het is ook mogelijk om argumenten op te geven voor de constructor van de klasse. Dit gaat als volgt:
LRegistry::set_lazy_class( 'db', 'DBConnection', array( 'arg1', 'arg2' ) );
Lazy Callback
Je kunt ook de uitkomst van een functie “lazy” registreren. Dus je registreert een functie (callback) en pas wanneer deze wordt opgevraagd, wordt de functie uitgevoerd.
// register lazy callback, will not be executed LRegistry::set_lazy_callback( 'avg', 'get_average' ); // at this point the callback will be executed LRegistry::get( 'avg' );
Argumenten
En ook hierbij kun je argumenten meegeven:
LRegistry::set_lazy_callback( 'avg', 'get_average', array( 'arg1', 'arg2' ) );
Anonieme functie
Vanaf PHP5.3+ kun je ook gebruik maken van anonieme functies.
LRegistry::set_lazy_callback( 'anonymous', function () {
return 'hello world!';
});
LRegistry
De genoemde functionaliteit is ingebouwd in de LRegistry klasse. De klasse is gebouwd volgens het Singleton pattern en bevat de volgende (statische) methoden:
// default overwrite LRegistry::default_overwrite( FALSE ); // use method as a getter: $overwrite = LRegistry::default_overwrite(); // set register entry LRegistry::set( 'site_title', 'My Site Title' ); LRegistry::set_lazy_class( 'db', 'DBConnection' ); LRegistry::set_lazy_callback( 'avg', 'get_average' ); // get register entry $value = LRegistry::get( 'site_title' ); // remove register entry LRegistry::remove( 'site_title' ); // check if entry exists $exists = LRegistry::has( 'site_title' ); // check if entry is loaded (and not in lazy state) $loaded = LRegistry::is_loaded( 'db' );
Overwrite
Er is een methode om aan te geven of waarden default moeten worden overschreven wanneer deze al bestaat. Daarnaast is het mogelijk om uitzonderingen hierop te maken, dus om een bepaalde waarde wel of niet te overschrijven ongeacht de default. Dat kan door bij de “set” method het argument “overwrite” mee te geven.
// default FALSE LRegistry::default_overwrite( FALSE ); // set entry LRegistry::set( 'site_title', 'My Site Title' ); // overwrite entry even if default is FALSE LRegistry::set( 'site_title', 'New Title', TRUE ); echo LRegistry::get( 'site_title' ); // output: New Title
Reload
Het is ook mogelijk om een lazy waarde dat al is uitgevoerd, opnieuw te laden. Dus een klasse dat al geïnitialiseerd is, daar wordt toch een nieuwe instantie van aangemaakt. En een callback functie dat al is uitgevoerd, opnieuw aanroepen. Dit kan door bij de “get” methode het argument “reload” mee te geven.
// lazy callback will be executed $value = LRegistry::get( 'avg' ); // set the second param to TRUE for // executing the callback again $value = LRegistry::get( 'avg', TRUE );
Downloaden
- Versie 1.1: private omgezet naar protected, zodat ze in eventuele subklassen kunnen worden aangepast.
lregistry-1.1.zip | Bekijk de code Versie 1.0: lregistry-1.0.zip | Bekijk de code
Licentie
Code valt onder de MIT licentie.























Erg interessante post! Heb hier zeker wat aan gehad en zal het ongetwijfeld gaan gebruiken in het vervolg!