Door
Pim -
op 24-04-2012 12:41
gewijzigd op 24-04-2012 12:41
3.279 views
Allemaal leuk en aardig dat OOP, maar het kan ook anders.
Ik heb geprobeerd alles zo puur functioneel mogelijk gehouden. Dus:
Geen veranderende variabelen!
Elke assignment had ook weggelaten kunnen worden, maar is toegevoegd voor de leesbaarheid of omdat PHP er anders niet mee om kan gaan, bijv. $array[2]($arg). De view() functie is niet puur functioneel. Ik heb geen idee hoe ik dat anders zou kunnen doen.
Ik heb daarnaast alleen maar de ternary operator gebruikt, geen ifs en elses, omdat ik het idee/de illusie heb dat dat meer overeenkomt met functionele talen.
Ik ben ook maar een noob met functioneel programmeren, dus alle suggesties zijn welkom :).
Ik gebruik het zelf heel veel voor database-resultaten. Ik heb een SQL_Table class die de select-queries voor je maakt, en een PDOStatement teruggeeft. Die stop ik dan in een PDOIterator, die stop ik dan weer in een FunctionalIterator, en dan kan je dingen doen als:
<?php
echo $personen
->find(array('x' => 'y'))
->filter(function($persoon) { return $persoon->leeftijd > 4; })
->map(function($persoon) { return $persoon->naam; })
->reduce(function($naam, $prev) { return $prev . ', ' . $naam; });
?>
En het leukste is.. de daadwerkelijke code wordt pas uitgevoerd in de reduce-stap, waar via een lusje alle elementen worden afgegaan. Alle tussenliggende stappen plakken gewoon iterators om iterators heen. Als je alleen de eerste 10 elementen nodig hebt, worden er maar 10 elementen door die hele reeks van iterators getrokken (gegeven dat filter niets weggooit ;))
Sterker nog, ik had ergens een BufferingIterator, daar kon je een query in stoppen en die haalde dan in stappen van 30 resultaten uit de database. Als je dan maar 50 resultaten nodig had haalde hij maximaal 60 dingen uit de database. Pagination, geheel transparant zeg maar :)
Oftewel: functioneel programmeren is machtig mooi. PHP is er niet helemaal ideaal voor, maar het kan prima.
Ik heb niet echt een framework, het zijn meer wat hulpmiddeltjes, classes en functies die in PHP zelf missen. (curry bijvoorbeeld, en str_concat!) Er is niet echt documentatie, ik heb ze gewoon geschreven omdat ik ze op dat moment "nodig" had: https://gist.github.com/2498047
Als je eens serieus naar functioneel programmeren wil kijken, probeer eens wat met Haskell. Er zijn hele mooie tutorials om erin te komen en eens in een echt functionele taal hebben geprogrammeerd geeft je allemaal nieuwe ideeën die je ook in je imperatieve en object-georiënteerde projecten kan gebruiken.