Second edition out now. This page is an archive for first edition readers.

Functional Programming in PHP Errata

This page lists Errata discovered in the Functional Programming in PHP book. The page numbers given refer to the printed book and PDF copies of the book.

If you've found an issue in the book please email

Page 24


tail_sum() should have $running_total set to 1 by default instead of 0.

Page 86

$x has incorrect return type

$x should return a type of Only and not an integer as defined in the book. So $x should be:

$x = function($value) {
   return Only::pack($value + 2);

Therefore the return types of $a and $b (declared in the same code block as the definition of $x in the book) now need to be updated to match as well.

$a = Only::pack(2)->map($x); // Only(4)
$b = $x(2); // Only(4)

Note the changes to the comments so that it now indicates a return value of Only(4).

$y definition missing

The definition of $y was missing from the book and should be:

$y = function($value) {
   return Only::pack($value * 5);

With this in place the third law is now provable.

Page 88

Maybe monad shouldn't overload map()

Firstly, map() should be defined as:

public function map($function) {
    return $function($this->container);

Then we need to add another method to the class to allow for the additional functionality.

public function mapAndPack($function) {
    return $this->isNothing() ?
        $this :

Finally this means that the call applying $verify_names must also be amended on the base of page 88.

$sth = $pdo->prepare("SELECT * FROM umuntu");
$row = $sth->fetch(PDO::FETCH_LAZY);
$verify_names = function($value) {
    return $value->ibizo . ' (verified)';
echo 'Name: ' . Maybe::pack($row)->


A big thank you to those that have helped to compile this list of errata: