Scripts

OO Registery

Deze site heeft maar weinig OO scripts, en dat terwijl de OO populariteit flink gestegen is hier op het forum. Daarom leek het me wel handig om wat meer OO scripts voor beginners te plaatsen. Dit is de eerste die een Registery weergeeft, dit is een design pattern. Wat is een Registery? Een registery is bedoeld om gegevens op te slaan op 1 algemeen punt waar je altijd bij kan. Design pattern, uhhh? Een design pattern is in OO een techniek om truc die de moeilijkste problemen binnen OO op een goede manier oplost. Deze Registery Dit is een redelijk uitgebreide Registery die je ook zo weer kan terug brengen naar een kleinere. Dit omdat er maar 4 basis methods, Registery::get(); Registery::set(); Registery::destory(); Registery::exists(), zijn. De download bevat 3 bestanden: Registery.php - De file met de klasse erin examples.php - Het voorbeeld file met de uitleg registerytest.php - De PHPUnit test case file voor de registery

examples.php
<?php

// laad de Registery
require_once 'Registery.php';

/*
 * 1. Mogelijke syntaxes
 * =====================
 */

/*
 * Met static methods
 */
Registery::set('foo', 'bar'); // voeg foo toe

echo Registery::get('foo'); // geeft 'bar'

Registery::destroy('foo'); // verwijder foo

/*
 * Met de mooie Magic methods
 */
$registery = new Registery; // maak een instance

$registery->foo = 'bar'; // voeg foo toe

echo $registery->foo; // geeft 'bar'

unset($registery->foo); // verwijder foo

/*
 * Als een array
 */
$registery = new Registery; // maak een instance

$registery['foo'] = 'bar'; // voeg foo toe

echo $registery['foo']; // geeft 'bar'

unset($registery['foo']); // verwijder foo

/*
 * Je kunt ook alles combineren
 */
Registery::set('foo', 'bar'); // voeg foo toe

$r = new Regitery; // maak een instance

echo $r->foo; // geeft 'bar'

$r['something'] = 'baz';

echo Registery::get('something'); // geeft 'baz'

/*
 * 2. Registery functies
 * =====================
 *
<void>	Registery::set( string $key, mixed $values )  Zet een waarde met de identifier $key en de waarde $values
<mixed> Registery::get( string $key )				  Krijg een waarde met de identifier $key
<void>	Registery::destroy( string $key )			  Verwijder een waarde met de identifier $key
<bool>	Registery::exists( string $key )			  Kijk of de identifier al een keer gezet is

Speciale gevallen
-----------------
Bij callables, of closures, wordt de closure uitgevoerd en de returnde waarde terug gegeven:
 */
$r = new Registery;

$r['foo'] = function() {
	// do something
	return 'some value';
};

echo $r['foo']; // geeft 'some value'

/*
 * 3. Error handling
 * =================
 */
try
{
	$r = new Registery;
	$r['foo'] = 'bar';

	echo $r['bar']; // kan niet, levert een OutOfBounds Exception op
}
catch( LogicException $e )
{
	echo sprintf('[%s] (line: %i) %s', get_class($e), $e->getLine(), $e->getMessage()); // geef de exception weer
}
Registery.php
<?php

/**
 * The registery class
 *
 * @author Wouter J <http://wouterj.nl>
 * @license Creative Commons 3.0 <http://creativecommons.org/licenses/by-sa/3.0/>
 */
class Registery implements \ArrayAccess
{
	protected static $values = array();

	// De basis methods
	public static function set( $key, $value )
	{
		if( self::exists($key) )
			throw new \OutOfBoundsException(sprintf('The key (%s) has already been set, destroy it first', $key));
		self::$values[$key] = $value;
	}

	public static function get( $key )
	{
		if( !self::exists($key) )
			throw new \OutOfBoundsException(sprintf('The key %s does not exists', $key));
		return self::$values[$key];
	}

	public static function destroy( $key )
	{
		unset(self::$values[$key]);
	}

	public static function exists( $key )
	{
		return array_key_exists($key, self::$values);
	}

	// De magic shortcut methods
	public function __get( $key )
	{
		return self::get($key);
	}
	public function __set( $key, $value )
	{
		return self::set($key, $value);
	}
	public function __call( $key, array $arguments = array() )
	{
		if( !is_callable(self::get($key)) )
			throw new \InvalidArgumentException(sprintf('The key %s is not a closure', $key));
		return call_user_func_array(self::get($key), $arguments);
	}
	public function __unset( $key )
	{
		return self::destroy($key);
	}
	public function __isset( $key )
	{
		return self::exists($key);
	}

	// ArrayAccess methods
	public function offsetGet( $key )
	{
		return self::get($key);
	}
	public function offsetSet( $key, $value )
	{
		return self::set($key, $value);
	}
	public function offsetUnset( $key )
	{
		return self::destroy($key);
	}
	public function offsetExists( $key )
	{
		return self::exists($key);
	}
}
registerytest.php
<?php

namespace snakeMvc\Tests;

use snakeMvc\Framework\Registery;

require_once '../lib/snakeMvc/Registery.php';

class RegisteryTest extends \PHPUnit_Framework_TestCase
{
	protected $registery;

	public function setUp()
	{
		$this->registery = new Registery;
	}

	protected function remove()
	{
		foreach( func_get_args() as $key )
			unset($this->registery[$key]);
	}

	public function testNormalValueWithStaticFunctions()
	{
		Registery::set('name', 'foo');

		$this->assertEquals('foo', Registery::get('name'));

		Registery::set('foo', Array('bar', 'baz'));

		$this->assertEquals(Array('bar', 'baz'), Registery::get('foo'));

		$this->remove('name', 'foo');
	}

	public function testNormalValueWithMagicFunctions()
	{
		$this->registery->name = 'foo';

		$this->assertEquals('foo', $this->registery->name);

		$this->registery->foo = Array('bar', 'baz');

		$this->assertEquals(Array('bar', 'baz'), $this->registery->foo);

		$this->remove('name', 'foo');
	}

	public function testCallableWithMagicFunctions()
	{
		$this->registery->foo = function() {
			return 'bar';
		};

		$this->assertEquals('bar', $this->registery->foo());

		$this->remove('foo');
	}

	public function testNormalValueWithArrayAccessFunctions()
	{
		$this->registery['name'] = 'foo';

		$this->assertEquals('foo', $this->registery['name']);

		$this->registery['foo'] = Array('bar', 'baz');

		$this->assertEquals(Array('bar', 'baz'), $this->registery['foo']);

		$this->remove('name', 'foo');
	}
}

Reacties

0
Nog geen reacties.