<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Building a Framework</title>
	<atom:link href="http://blog.reen-solutions.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.reen-solutions.com</link>
	<description>De uitdagingen, tijdens het bouwen van een Framework</description>
	<lastBuildDate>Mon, 10 Aug 2009 15:30:32 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Zend Framework</title>
		<link>http://blog.reen-solutions.com/2009/08/10/zend-framework/</link>
		<comments>http://blog.reen-solutions.com/2009/08/10/zend-framework/#comments</comments>
		<pubDate>Mon, 10 Aug 2009 15:30:32 +0000</pubDate>
		<dc:creator>Reen</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[Zend]]></category>

		<guid isPermaLink="false">http://blog.reen-solutions.com/?p=54</guid>
		<description><![CDATA[Bij deze gooi ik het roer om en ga ik verder met Zend Framework. Hoewel ik het niet met de core van het mvc systeem eens ben en i het zelf anders zou bouwen, werkt het wel lekker snel. Zeker nu ze een commandline tool hebben.
Je hoort binnenkort van me!
]]></description>
			<content:encoded><![CDATA[<p>Bij deze gooi ik het roer om en ga ik verder met Zend Framework. Hoewel ik het niet met de core van het mvc systeem eens ben en i het zelf anders zou bouwen, werkt het wel lekker snel. Zeker nu ze een commandline tool hebben.</p>
<p>Je hoort binnenkort van me!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.reen-solutions.com/2009/08/10/zend-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Void functies in classes</title>
		<link>http://blog.reen-solutions.com/2009/07/06/void-functies-in-classes/</link>
		<comments>http://blog.reen-solutions.com/2009/07/06/void-functies-in-classes/#comments</comments>
		<pubDate>Mon, 06 Jul 2009 15:30:53 +0000</pubDate>
		<dc:creator>Reen</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[Tips & Tricks]]></category>

		<guid isPermaLink="false">http://blog.reen-solutions.com/?p=46</guid>
		<description><![CDATA[Void functies zijn de functies die niets returnen. Over het algemeen gaat het om setters en functies die de state van de classe veranderen.
Een voorbeeld
class Car
{
    protected $speed = 50;
    // Hieronder zie je een void functie (= geen return)
    public function setSpeed($speed)
    [...]]]></description>
			<content:encoded><![CDATA[<p>Void functies zijn de functies die niets returnen. Over het algemeen gaat het om setters en functies die de state van de classe veranderen.</p>
<p><em>Een voorbeeld</em></p>
<pre><code>class Car
{
    protected $speed = 50;
    // Hieronder zie je een void functie (= geen return)
    public function setSpeed($speed)
    {
        $this-&gt;speed = $speed;
    }
    /* Meer code */
}</code></pre>
<p>De code om dit aan te roepen ziet er dan bijvoorbeeld zo uit:</p>
<pre><code>$c = new Car();
$c-&gt;setColor(Color::RED);
$c-&gt;setSpeed(0);
$c-&gt;openDoor(1);
$c-&gt;setSpeed(100);</code></pre>
<p>Wanneer echter je variable naam ($c) een beetje groot wordt ($eenOfAnderMerkAutoNaam)  is dit een typewerk waar je u tegen zegt. Daarnaast wordt het er ook een stuk minder leesbaar op.<br />
Om dit tegen te gaan laat ik alle void functies $this returnen. Zo krijg je de volgende code:</p>
<pre><code>class Car
{
    protected $speed = 50;
    // Hieronder zie je een void functie (= geen return)
    public function setSpeed($speed)
    {
        $this-&gt;speed = $speed;

        return $this;
    }
    /* Meer code */
}</code></pre>
<pre><code>$c = new Car();
$c->setColor(Color::RED)
  ->setSpeed(0)
  ->openDoor(1)
  ->setSpeed(100);</code></pre>
<p>En kijk eens aan, je hoeft de variable maar 1 keer aan te roepen!</p>
<p>Check je!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.reen-solutions.com/2009/07/06/void-functies-in-classes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Onzichtbare setters en getters part 2</title>
		<link>http://blog.reen-solutions.com/2009/06/30/onzichtbare-setters-en-getters-part-2/</link>
		<comments>http://blog.reen-solutions.com/2009/06/30/onzichtbare-setters-en-getters-part-2/#comments</comments>
		<pubDate>Tue, 30 Jun 2009 17:02:21 +0000</pubDate>
		<dc:creator>Reen</dc:creator>
				<category><![CDATA[Php restrictions]]></category>
		<category><![CDATA[Tips & Tricks]]></category>

		<guid isPermaLink="false">http://blog.reen-solutions.com/?p=41</guid>
		<description><![CDATA[Hallo trouwe lezers.. Het leven is op &#8216;t moment te druk voor woorden, kom niet eens toe aan world of warcraft spelen. Duidelijk tijd tekort dus. Maar dan nu toch een artikel.
Vorige keer heb ik een artikel geschreven over Onzichtbare getters en setters, opzich een leuk concept, als je het van de andere kant bekijkt, [...]]]></description>
			<content:encoded><![CDATA[<p>Hallo trouwe lezers.. Het leven is op &#8216;t moment te druk voor woorden, kom niet eens toe aan world of warcraft spelen. Duidelijk tijd tekort dus. Maar dan nu toch een artikel.</p>
<p>Vorige keer heb ik een artikel geschreven over <a title="Onzichtbare getters en setters" href="/2009/06/18/onzichtbare-getters-en-setters/">Onzichtbare getters en setters</a>, opzich een leuk concept, als je het van de andere kant bekijkt, zou je alleen altijd getters en setters moeten hebben voor het geval je valdatie toe wilt voegen. Natuurlijk kan je dat allemaal doen met een goede IDE. Aangezien ik op werk met vim zit te klooien, heb ik een leuk alternatief verzonnen.</p>
<pre><code>/** Vergeet niet dat deze functie binnen een class thuishoort **/
public function __call($function, $args)
{
    // Set method, match en sla de variable-naam op in $matches
    if ( preg_match('/^set([A-Z])([0-9a-zA-Z]*)$/', $function, $matches) )
    {
        // Maak de eerste letter lowercase
        $key = strtolower($matches[1]).$matches[2];
        // Zet de variable
        $this-&gt;$key = array_shift($args);

        // Mijn gewoonte met void functies
        return $this;
    }

    // Set method, match en sla de variable-naam op in $matches
    if ( preg_match('/^get([A-Z])([0-9a-zA-Z]*)$/', $function, $matches) )
    {
        // Maak de eerste letter lowercase
        $key = strtolower($matches[1]).$matches[2];

        // Als de variable niet bestaat, return dan null
        if ( !isset($this-&gt;$key) )
        {
            return null;
        }

        // Return de waarde
        return $this-&gt;$key;
    }

    throw new Exception('Calling undefined function.');
} </code></pre>
<p>Werkt prima zo, alle variablen die gewoon met een letter beginnen hebben op deze manier een setter en een getter (maak ze wel protected of private). Wil je echt dat een bepaalde variable niet aangesproken kan worden buiten de classe, laat hem dan met een underscore &#8220;_&#8221; beginnen.</p>
<p>En zoals altijd, comments zijn welkom, scheld me alsjeblieft uit dat ik niet actief op mijn blog ben geweest&#8230;</p>
<p>Cheers!</p>
<h2>Voorbeeld</h2>
<p><em>Ga er vanuit dat de classe B de bovenstaande functie bevat.</em></p>
<pre><code>class A extends B
{
    protected $var1;
    protected $test;
    protected $testVar2 = 'hallo';
}

$a = new A();
// Setters
$a-&gt;setVar1('test')
  -&gt;setTest('Sup?');

// Getter
echo $a-&gt;getTestVar2();

// Nog een Setter
$a-&gt;setTestVar2('iets anders');

// Het resultaat
print_r($a);
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.reen-solutions.com/2009/06/30/onzichtbare-setters-en-getters-part-2/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Onzichtbare getters en setters</title>
		<link>http://blog.reen-solutions.com/2009/06/18/onzichtbare-getters-en-setters/</link>
		<comments>http://blog.reen-solutions.com/2009/06/18/onzichtbare-getters-en-setters/#comments</comments>
		<pubDate>Thu, 18 Jun 2009 15:30:56 +0000</pubDate>
		<dc:creator>Reen</dc:creator>
				<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[Oop]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Tip]]></category>
		<category><![CDATA[Trick]]></category>

		<guid isPermaLink="false">http://blog.reen-solutions.com/?p=36</guid>
		<description><![CDATA[In een poging de grenzen van php te verkennen, heb ik een methode gevonden om setters en getters &#8220;onzichtbaar&#8221; te implementeren. Het lijkt in je code net of je de attributen direct aanspreekt, maar in werkelijkheid, kun je er daadwerkelijk validatie aan hangen, iets waar je normaal gesproken een setter of een getter nodig hebt.
Voorbeeld
class [...]]]></description>
			<content:encoded><![CDATA[<p>In een poging de grenzen van php te verkennen, heb ik een methode gevonden om setters en getters &#8220;onzichtbaar&#8221; te implementeren. Het lijkt in je code net of je de attributen direct aanspreekt, maar in werkelijkheid, kun je er daadwerkelijk validatie aan hangen, iets waar je normaal gesproken een setter of een getter nodig hebt.</p>
<h3>Voorbeeld</h3>
<pre><code>class Example
{
    // Attribuut
    public $attribute;
    // Setter
    public function setAttribute($value)
    {
        // Validation
        $this-&gt;attribute = $value;
    }
}

$example = new Example();

// Direct
$example-&gt;attribute = 1;

// Via setter
$example-&gt;setAttribute(1);</code></pre>
<h3>Waarom?</h3>
<p>Goeie vraag, geen idee, zoals ik al zei, ik was de grenzen aan het verkennen, erg nuttig is het dus niet, maar wel interessant <img src='http://blog.reen-solutions.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<h3>Doel?</h3>
<p>Het doel is dus dat je achteraf je validatie / filters op een bepaald attribuut kan toevoegen, zonder dat je daar functies voor aan hoeft te roepen, natuurlijk moet je de setter of de getter wel aanmaken. Om dit te realiseren maak ik gebruik van de magische functies __set en __get, die alleen aangesproken worden wanneer php het betreffende attribuut kan bereiken omdat deze bijvoorbeeld private, protected is of zelfs niet bestaat.</p>
<h3>Code!</h3>
<p>Hieronder zie je hoe ik de classe geschreven heb.</p>
<pre><code>class AutoGetSet
{
    public function __set($key, $value)
    {
        // De naam van de set methode
        $method = 'set'.ucfirst($key);
        try
        {
            // Roep de functie aan
            call_user_func(
                array($this, $method),
                $value
            );
        }
        catch ( InvalidFunctionException $ex )
        {
            throw new Exception('No setter defined for '.$key.'.');
        }
    }

    public function __get($key)
    {
        // De naam van de set
        $method = 'get'.ucfirst($key);
        try
        {
            // Roep de functie aan en return het resultaat
            return call_user_func(
                array($this, $method)
            );
        }
        catch ( InvalidFunctionException $ex )
        {
            throw new Exception('No setter defined for '.$key.'.');
        }
    }

    // Als er een functie aangeroepen wordt die niet bestaat, gooi dan een Exception.
    public function __call($function, $args)
    {
        throw new InvalidFunctionException('Function '.$function.' does not exist in '.__CLASS__.'.');
    }
}</code></pre>
<p>Om te zorgen dat de set en getters aangesproken worden, moet je het attribuut protected maken.</p>
<h3>Conclusie</h3>
<p>Het is me dus uiteindelijk gelukt om de setters en getters &#8220;onzichtbaar&#8221; te maken. Hoewel ik het zelf niet gebruik vond ik het toch wel een geslaagde test.</p>
<p><em>Nog wat voorbeelden</em><br />
Zonder setter en getter zal de code er zo uitzien en werkt hij gewoon zoals je van php gewend bent.</p>
<pre><code>class Example
{
    public $attribute;
}

$example = new Example();
$example-&gt;attribute = 'Test';
echo $example-&gt;attribute;</code></pre>
<p>Vervolgens kun je de setter en de getter toevoegen. Let op het attribuut is protected geworden.</p>
<pre><code>class Example extends AutoGetSet
{
    // Let op protected!
    protected $attribute;

    // Setter
    public function setAttribute($value)
    {
        echo 'SET attribute to '.$value;
        $this-&gt;attribute = $value;
    }

    // Getter
    public function getAttribute()
    {
        echo 'GET attribute';
        return $this-&gt;attribute;
    }
}

$example = new Example();
$example-&gt;attribute = 'Test';
echo $example-&gt;attribute;</code></pre>
<p>Als je nu de output bekijkt zul je zien dat de setter en de getter automatisch aangeroepen worden.</p>
<p>Ik ben benieuwd wat vindt jij ervan? Nog leuke ideeen voor situaties waarbij dit bruikbaar is?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.reen-solutions.com/2009/06/18/onzichtbare-getters-en-setters/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Structuur</title>
		<link>http://blog.reen-solutions.com/2009/06/17/structuur/</link>
		<comments>http://blog.reen-solutions.com/2009/06/17/structuur/#comments</comments>
		<pubDate>Wed, 17 Jun 2009 15:30:11 +0000</pubDate>
		<dc:creator>Reen</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Problems]]></category>
		<category><![CDATA[Requirements]]></category>

		<guid isPermaLink="false">http://blog.reen-solutions.com/?p=8</guid>
		<description><![CDATA[Het eerste probleem waar ik tegenop loop met mijn framework is de structuur.
Regels

De superglobals (GET, POST, SERVER, SESSION), mogen niet direct vanuit de model/controller of view aangesproken worden;
De controller mag nooit een &#8220;view element&#8221; zoals bijvoorbeeld een formulier of een paginator aanmaken;
De controller moet maar 1 keer gemaakt hoeven worden, dat betekend dat 1 controller [...]]]></description>
			<content:encoded><![CDATA[<p>Het eerste probleem waar ik tegenop loop met mijn framework is de structuur.</p>
<h3>Regels</h3>
<ul>
<li>De superglobals (GET, POST, SERVER, SESSION), mogen niet direct vanuit de model/controller of view aangesproken worden;</li>
<li>De controller mag nooit een &#8220;view element&#8221; zoals bijvoorbeeld een formulier of een paginator aanmaken;</li>
<li>De controller moet maar 1 keer gemaakt hoeven worden, dat betekend dat 1 controller verschillende types views aan kan (hiermee is het mogelijk om een controller zowel JSON, XML als XHTML uitspuigt zonder dat je daarvoor iets in je controller moet veranderen).</li>
</ul>
<h3>Wat wil ik ondersteunen</h3>
<ul>
<li>Model die voor alle applicaties beschikbaar is;</li>
<li>Model voor de applicatie zelf;</li>
<li>Controllers;</li>
<li>Views;</li>
<li>Renders.</li>
</ul>
<p>Wat vindt jij? Mis ik iets?</p>
<h3>De mappen</h3>
<p>Met de bovenstaande informatie, ben ik tot de conclusie gekomen dat er 3 grote elementen zijn, namelijk &#8220;public&#8221;, &#8220;application&#8221; en &#8220;general libraries&#8221;.</p>
<p><em>Public</em><strong><br />
</strong>Het gedeelte wat voor de gebruiker zichtbaar is, ook wel public-www, httpdocs, htdocs en www genoemd.</p>
<p><em>Application<br />
</em>Dingen die voor de applicatie specifiek zijn. Denk aan controllers, views, maar ook aan specifieke models.</p>
<p><em>General Libraries<br />
</em>De general libraries bestaan onder andere uit de core van het framework. Dit zijn de classes die voor elke web-applicatie bruikbaar kunnen zijn.</p>
<pre><code>[root]
 |- application
 |   |- controller
 |   |   \- {CONTROLLER CLASSES}
 |   |
 |   |- view
 |   |   \- {VIEW CLASSES}
 |   |
 |   |- template
 |   |   |- html
 |   |   \- {OUTPUT FORMATS}
 |   |
 |   |- library
 |   |   \- {APPLICATION MODELS}
 |   |
 |   \- Boot.php
 |
 |- library
 |   \- {MODELS}
 |
 \- httpdocs
     \- index.php
</code></pre>
<h3>View Classes?</h3>
<p>Ja ik kies er in mijn framework voor om voor elke Action een aparte View classe te maken. In deze classe kunnen functies gemaakt worden die bijvoorbeeld voor de template nodig zijn.</p>
<h3>Boot.php?</h3>
<p>Dit is waar ik het meest mee in mijn maag zit. Ergens moet de applicatie opstarten, maar wat is de verantwoordelijkheid van deze boot? Sowieso wil ik dat hier het grootste deel van de superglobals afgehandeld wordt, zodat ik die in ieder geval niet direct vanuit de rest van mijn framework aan hoef te roepen.</p>
<h3>Frontcontroller?</h3>
<p>Waar en hoe implementeer ik de frontcontroller? Routers liggen mij niet zo, aangezien het onnodig complex wordt, soms heb je namelijk 20+ routers nodig voor iets wat je normaal kan programmeren in 3 regels. Misschien een extra file FrontController.php, waarin de frontcontroller class staat, die op basis van een Request Object bepaald welke controller/action er aangesproken moet worden? Spreekt Boot.php de frontcontroller aan?</p>
<h3>Antwoorden</h3>
<p>Voordat ik mijn oplossingen met jullie deel, hoor ik graag eerst wat jou mening is. Wat vindt jij van mijn oplossingen?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.reen-solutions.com/2009/06/17/structuur/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Getting started</title>
		<link>http://blog.reen-solutions.com/2009/06/16/getting-started/</link>
		<comments>http://blog.reen-solutions.com/2009/06/16/getting-started/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 15:30:05 +0000</pubDate>
		<dc:creator>Reen</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Wie]]></category>

		<guid isPermaLink="false">http://blog.reen-solutions.com/?p=1</guid>
		<description><![CDATA[Hallo allemaal, welkom op mijn blog.
Wie ben ik?
Voor de mensen die mij nog niet kennen, mijn naam is Reen Lokum. Ik studeer momenteel informatica op de Hogeschool Rotterdam. Puzzelen is het leukste wat er is en dan heb ik het niet over de legpuzzel. Ik denk graag na over programmeer-concepten, zodat ik problemen op de [...]]]></description>
			<content:encoded><![CDATA[<p>Hallo allemaal, welkom op mijn blog.</p>
<h3>Wie ben ik?</h3>
<p>Voor de mensen die mij nog niet kennen, mijn naam is Reen Lokum. Ik studeer momenteel informatica op de Hogeschool Rotterdam. Puzzelen is het leukste wat er is en dan heb ik het niet over de legpuzzel. Ik denk graag na over programmeer-concepten, zodat ik problemen op de beste manier kan oplossen.</p>
<h3>Wat is het plan?</h3>
<p>Een aantal weken geleden heb ik besloten om mijn eigen framework te bouwen in php. Je zou zeggen, daar zijn er toch genoeg van? Dat klopt, ik heb dan ook een tijdje met het Zend Framework gewerkt. Hoewel ik nog nooit van me leven zo snel een applicatie in elkaar gezet had, bleef het aan me vreten dat sommige dingen in mijn ogen gewoon niet op de beste manier opgelost waren. Daarom heb ik dus besloten mijn eigen framework te bouwen.</p>
<h3>Doel</h3>
<p>Het primaire doel van het framework is het toevoegen van MVC functionaliteit binnen php. Daarna zal het framework uitgebouwd worden met onder andere een ORM.</p>
<p>Kun je programmeren? Houd je ook van discussieren? Check dit blog dan regelmatig en wie weet leren we wat van elkaar!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.reen-solutions.com/2009/06/16/getting-started/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
