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 :).

Gebruik:
<?php
echo app(
array(
route('/hi/:name', function($params) {
return 'Hi '.$params['name'];
})
), '/hi/Pim', array());
?>

https://gist.github.com/2478668
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.
Dat ziet er natuurlijk goed uit, maar ik neem aan dat je alleen de find clause in je query verwerkt en dan heb je zo wel heel veel overhead. Toch?

Heb je verder nog inhoudelijke opmerkingen op het frameworkje?
Al eens gekeken naar Silex?
Silex heeft toch niet zo veel met functioneel programmeren van doen?
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.
Nou, Silex lijkt wel erg veel op jouw voorbeeldje Pim, en ook die van Jelmer :)
@Jelmer,
Ja heb ik kreeg toevallig ook dit idee terwijl ik bezig was in 'Learning Haskell for Great Good' ;).

@Kees,
Ja, de interface lijkt erop, maar de werking is wel ietsjes anders, niet?
@Jelmer,
Ik vind je Haskell-style maybe heerlijk ;)

Reageren