LRegistry – PHP Lazy Registry Class
  • PHP

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

Licentie

Code valt onder de MIT licentie.

Gerelateerde artikelen

Reacties (1)

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

Stuur je reactie

  • RSS
  • LinkedIn
  • Twitter