php, arrays & functional programming

33
PHP, Arrays & Functional Programming

Upload: michael-rutz

Post on 19-Jan-2017

265 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: PHP, Arrays & Functional Programming

PHP, Arrays & Functional Programming

Page 2: PHP, Arrays & Functional Programming

4/2016

Model Driven Software DevelopmentSclable transforms your knowledge into

enterprise-grade, ready-to-go Business Applications.

Sclable Business Solutions GmbHhttps://sclable.com/

Page 3: PHP, Arrays & Functional Programming

4/2016

By the way:

We’re always looking forFull Stack Developers

Page 4: PHP, Arrays & Functional Programming

4/2016

Sclable Platform Senior Developer

PL/PGSQL - PHP - JS← full stack →

Aviation Enthusiast

Michael Rutz

Page 5: PHP, Arrays & Functional Programming

4/2016

f(x) === f(x)Immutable

y = x; f(x); x === y;No side effects

Functional Programming

Page 6: PHP, Arrays & Functional Programming

4/2016

$first = 0;$second = 1;for ($i = 0; $i < 10; $i++) { echo $first . PHP_EOL; $tmp = $first; $first = $second; $second += $tmp;}

Functional Programming

Global state has changed

Page 7: PHP, Arrays & Functional Programming

4/2016

function fibonacci($n, $first = 0, $second = 1) { if ($n === 0) return ''; return $first . PHP_EOL . fibonacci(--$n, $second, $first + $second);}

echo fibonacci(10);

Functional Programming

Global state untouched

Immutable

Page 8: PHP, Arrays & Functional Programming

4/2016

FPHP?

Functional Programming in PHP

Page 9: PHP, Arrays & Functional Programming

4/2016

Imperative design, but

Closures ✓

Functional Programming in PHP

Page 10: PHP, Arrays & Functional Programming

4/2016

$ids = array_map(function ($item) { return $item->id;}, $list);

// js / ES2015let ids = list.map(item => item.id);

Functional Programming in PHP

Page 11: PHP, Arrays & Functional Programming

4/2016

Implemented the right way,code readability can be improved.

Functional Programming in PHP

Page 12: PHP, Arrays & Functional Programming

4/2016

https://secure.php.net/manual/en/book.array.php

Array Functions

Page 13: PHP, Arrays & Functional Programming

4/2016

Performance !Nice shorthands !

Array Functions

Page 14: PHP, Arrays & Functional Programming

4/2016

$idsToLoad = array_diff($idsRequired, $idsLoaded);

// e.g. cities -> countries$referencedCountryIds = array_unique([1,1,2,3]);

Array Functions

Page 15: PHP, Arrays & Functional Programming

4/2016

array array_map(callable, array, array...)

bool array_walk(&array, callable)

array array_unique(array, sort_flags)

Inconsistent API

Page 16: PHP, Arrays & Functional Programming

4/2016

https://github.com/sclable/array-functions

composer require sclable/array-functions

class ArrayWrap

Page 17: PHP, Arrays & Functional Programming

4/2016

Normalized ParamsOO & FP Approach

class ArrayWrap

Page 18: PHP, Arrays & Functional Programming

4/2016

// e.g. cities -> countries$referencedCountryIds = ArrayWrap::create($cities) ->map(function ($city) { return->countryId; }) ->unique();

e.g.

Page 19: PHP, Arrays & Functional Programming

4/2016

More e.g.

Page 20: PHP, Arrays & Functional Programming

4/2016

$array = array_pad([], 10, 0);foreach ($array as &$item) { $item = rand();}

// find max$max = null;foreach ($array as $item) { $max = $max === null ? $item : max($max, $item);}

Page 21: PHP, Arrays & Functional Programming

4/2016

ArrayWrap::create([]) ->pad(10, 0) ->map(function () { return rand(); }) ->max();

Page 22: PHP, Arrays & Functional Programming

4/2016

// [x] immutable// [x] no side effects

$emptyArr = ArrayWrap::create([]);$padded = $emptyArr->pad(10, 0);$randList = $padded->map( … );$max = $randList->max();

var_dump($emptyArr === $padded); // falsevar_dump($padded === $randList); // false

Page 23: PHP, Arrays & Functional Programming

4/2016

foreach vs. array_map/array_walk

Performance Considerations

Page 24: PHP, Arrays & Functional Programming

4/2016

! major performance impact on closures !

xDebug

Page 25: PHP, Arrays & Functional Programming

4/2016

$ids = []foreach ($models as $model) { $ids[] = $model->id;}

$ids = array_map( function ($model) { return $model->id; }, $models);

Extract a list of ids

Page 26: PHP, Arrays & Functional Programming

4/2016

Foreach vs. Array_map 1:0

Extract a list of ids

Page 27: PHP, Arrays & Functional Programming

4/2016

$assigned = [];foreach ($instances as $instance) { $assigned[$instance->id] = $instance;}

$assigned = array_combine(array_map( function ($instance) {return $instance->id;}, $instances), $instances);

Assign by id

Page 28: PHP, Arrays & Functional Programming

4/2016

Foreach vs. Array_map 2:0

Assign by id

Page 29: PHP, Arrays & Functional Programming

4/2016

$yelled = [‘OH’, ‘SO’, ‘LOUD’];

$pssst = [];foreach ($yelled as $v) { $pssst[] = strtolower($v);}

$pssst = array_map(‘strtolower’, $yelled);

Apply native functions

Page 30: PHP, Arrays & Functional Programming

4/2016

Foreach vs. Array_map 2:1

Apply native functions

Page 31: PHP, Arrays & Functional Programming

4/2016

Performance.

But readability!

Conclusions

Page 32: PHP, Arrays & Functional Programming

4/2016

Performance.

But readability!

Conclusions

+ It looks cool!

Page 33: PHP, Arrays & Functional Programming

4/2016

Thank you.

That’s all folks!