PHP meetup#4 Godek

82
Wprowadzenie Przyklady Podsumowanie Programowanie funkcyjne w PHP Maciek Godek { fido : labs } [email protected] PHP3City Meetup#4, 06.12.2013 Maciek Godek Programowanie funkcyjne w PHP

Transcript of PHP meetup#4 Godek

Page 1: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

Programowanie funkcyjne w PHP

Maciek Godek

{ fido : labs }

[email protected]

PHP3City Meetup#4, 06.12.2013

Maciek Godek Programowanie funkcyjne w PHP

Page 2: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

Czym jest programowanie funkcyjne?Dlaczego zainteresowac sie FP?

Czym jest programowanie funkcyjne?

Programowanie funkcyjne (FP) polega na:• unikaniu skutków ubocznych,• stosowaniu funkcji wyzszego rzedu.

Maciek Godek Programowanie funkcyjne w PHP

Page 3: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

Czym jest programowanie funkcyjne?Dlaczego zainteresowac sie FP?

Czym jest programowanie funkcyjne?

Programowanie funkcyjne (FP) polega na:• unikaniu skutków ubocznych,• stosowaniu funkcji wyzszego rzedu.

Maciek Godek Programowanie funkcyjne w PHP

Page 4: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

Czym jest programowanie funkcyjne?Dlaczego zainteresowac sie FP?

Czym jest programowanie funkcyjne?

Programowanie funkcyjne (FP) polega na:• unikaniu skutków ubocznych,• stosowaniu funkcji wyzszego rzedu.

Maciek Godek Programowanie funkcyjne w PHP

Page 5: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

Czym jest programowanie funkcyjne?Dlaczego zainteresowac sie FP?

Sformułowanie problemu

Jaki problem chcemy rozwiazac?- Uczynic programowanie jak maksymalnie efektywnym, czyli:

• musiec jak najmniej pamietac, oraz• móc jak najwiecej wnioskowac.

Maciek Godek Programowanie funkcyjne w PHP

Page 6: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

Czym jest programowanie funkcyjne?Dlaczego zainteresowac sie FP?

Sformułowanie problemu

Jaki problem chcemy rozwiazac?- Uczynic programowanie jak maksymalnie efektywnym, czyli:

• musiec jak najmniej pamietac, oraz• móc jak najwiecej wnioskowac.

Maciek Godek Programowanie funkcyjne w PHP

Page 7: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

Czym jest programowanie funkcyjne?Dlaczego zainteresowac sie FP?

Sformułowanie problemu

Jaki problem chcemy rozwiazac?- Uczynic programowanie jak maksymalnie efektywnym, czyli:

• musiec jak najmniej pamietac, oraz• móc jak najwiecej wnioskowac.

Maciek Godek Programowanie funkcyjne w PHP

Page 8: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

Czym jest programowanie funkcyjne?Dlaczego zainteresowac sie FP?

Sformułowanie problemu

Jaki problem chcemy rozwiazac?- Uczynic programowanie jak maksymalnie efektywnym, czyli:

• musiec jak najmniej pamietac, oraz• móc jak najwiecej wnioskowac.

Maciek Godek Programowanie funkcyjne w PHP

Page 9: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

Czym jest programowanie funkcyjne?Dlaczego zainteresowac sie FP?

Sformułowanie problemu

Innymi słowy: uczynic program jak najbardziej czytelnym

Maciek Godek Programowanie funkcyjne w PHP

Page 10: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

Czym jest programowanie funkcyjne?Dlaczego zainteresowac sie FP?

Sformułowanie problemu

Innymi słowy: uczynic program jak najbardziej czytelnym

Maciek Godek Programowanie funkcyjne w PHP

Page 11: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

Czym jest programowanie funkcyjne?Dlaczego zainteresowac sie FP?

Sposoby na usprawnienie pracy z kodem

Pomysły:• korzystanie z Integrated Development Environment• uzywanie statycznej kontroli typów• stosowanie konwencji w nazewnictwie obiektów• ogólniej: przestrzeganie konwencji w sposobie uzycja

jezyka

Maciek Godek Programowanie funkcyjne w PHP

Page 12: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

Czym jest programowanie funkcyjne?Dlaczego zainteresowac sie FP?

Sposoby na usprawnienie pracy z kodem

Pomysły:• korzystanie z Integrated Development Environment• uzywanie statycznej kontroli typów• stosowanie konwencji w nazewnictwie obiektów• ogólniej: przestrzeganie konwencji w sposobie uzycja

jezyka

Maciek Godek Programowanie funkcyjne w PHP

Page 13: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

Czym jest programowanie funkcyjne?Dlaczego zainteresowac sie FP?

Sposoby na usprawnienie pracy z kodem

Pomysły:• korzystanie z Integrated Development Environment• uzywanie statycznej kontroli typów• stosowanie konwencji w nazewnictwie obiektów• ogólniej: przestrzeganie konwencji w sposobie uzycja

jezyka

Maciek Godek Programowanie funkcyjne w PHP

Page 14: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

Czym jest programowanie funkcyjne?Dlaczego zainteresowac sie FP?

Sposoby na usprawnienie pracy z kodem

Pomysły:• korzystanie z Integrated Development Environment• uzywanie statycznej kontroli typów• stosowanie konwencji w nazewnictwie obiektów• ogólniej: przestrzeganie konwencji w sposobie uzycja

jezyka

Maciek Godek Programowanie funkcyjne w PHP

Page 15: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

Czym jest programowanie funkcyjne?Dlaczego zainteresowac sie FP?

Sposoby na usprawnienie pracy z kodem

Pomysły:• korzystanie z Integrated Development Environment• uzywanie statycznej kontroli typów• stosowanie konwencji w nazewnictwie obiektów• ogólniej: przestrzeganie konwencji w sposobie uzycja

jezyka

Maciek Godek Programowanie funkcyjne w PHP

Page 16: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

Czym jest programowanie funkcyjne?Dlaczego zainteresowac sie FP?

Konwencje w sposobie uzycia jezyka

Kilka popularnych konwencji:• notacja wegierska• metodologia OOP (hermetyzacja, enkapsulacja,

polimorfizm, dziedziczenie, ...)• programowanie funkcyjne

Maciek Godek Programowanie funkcyjne w PHP

Page 17: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

Czym jest programowanie funkcyjne?Dlaczego zainteresowac sie FP?

Konwencje w sposobie uzycia jezyka

Kilka popularnych konwencji:• notacja wegierska• metodologia OOP (hermetyzacja, enkapsulacja,

polimorfizm, dziedziczenie, ...)• programowanie funkcyjne

Maciek Godek Programowanie funkcyjne w PHP

Page 18: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

Czym jest programowanie funkcyjne?Dlaczego zainteresowac sie FP?

Konwencje w sposobie uzycia jezyka

Kilka popularnych konwencji:• notacja wegierska• metodologia OOP (hermetyzacja, enkapsulacja,

polimorfizm, dziedziczenie, ...)• programowanie funkcyjne

Maciek Godek Programowanie funkcyjne w PHP

Page 19: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

Czym jest programowanie funkcyjne?Dlaczego zainteresowac sie FP?

Konwencje w sposobie uzycia jezyka

Kilka popularnych konwencji:• notacja wegierska• metodologia OOP (hermetyzacja, enkapsulacja,

polimorfizm, dziedziczenie, ...)• programowanie funkcyjne

Maciek Godek Programowanie funkcyjne w PHP

Page 20: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

Zagadka: co robi ponizszy kod?

function złoncz($słowa) {$wynik = ”;$n = count($słowa);if($n < 1) { return $wynik; }$biezace = reset($słowa);for($i = 0; $i < $n; $i++) {

$wynik .= $biezace;if($i < $n-2) { $wynik .= ’, ’; }elseif($i == $n-2) { $wynik .= ’ i ’; }$biezace = next($słowa);

}return $wynik;

}Maciek Godek Programowanie funkcyjne w PHP

Page 21: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

Zagadka: co robi ponizszy kod?

function złoncz($słowa) {$wynik = ”;$n = count($słowa);if($n < 1) { return $wynik; }$biezace = reset($słowa);for($i = 0; $i < $n; $i++) {

$wynik .= $biezace;if($i < $n-2) { $wynik .= ’, ’; }elseif($i == $n-2) { $wynik .= ’ i ’; }$biezace = next($słowa);

}return $wynik;

}Maciek Godek Programowanie funkcyjne w PHP

Page 22: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

Rozwiazanie: łaczenie słów naturalnymi spójnikami

Rozwiazanie: złacza słowa spójnikami, w taki sposób, w jakiłaczymy słowa w mowie potocznej, tzn. sklejamy wszystkiesłowa przecinkami, za wyjatkiem dwóch ostatnich, któresklejamy spójnikiem ’i’.

Maciek Godek Programowanie funkcyjne w PHP

Page 23: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

Przykład uzycia

złaczenie([]) = ”;złaczenie([’Ola’]) = ’Ola’;złaczenie([’Ola’, ’Ala’]) = ’Ola i Ala’;złaczenie([’Ola’, ’Ala’, ’Ula’]) = ’Ola, Ala i Ula’;złaczenie([’Ola’, ’Ala’, ’Ula’, ’Ela’])

= ’Ola, Ala, Ula i Ela’;

Maciek Godek Programowanie funkcyjne w PHP

Page 24: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

Abstrakcja!

złaczenie([]) = ”;złaczenie([$a]) = $a;złaczenie([$a, $b]) = $a . ’ i ’ .$b;złaczenie([$a, $b, $c, ...])

= $a . ’, ’ . złaczenie([$b, $c, ...]);

Maciek Godek Programowanie funkcyjne w PHP

Page 25: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

W strone PHP

function złaczone($słowa) { // marzenmatch($słowa) {case []:

return ”;case [$a]:

return $a;case [$a, $b]:

return $a . ’ i ’ . $b;case [$a, $b, $c, ...]:

return $a . ’, ’. złaczone([$b, $c, ...]);

}}

Maciek Godek Programowanie funkcyjne w PHP

Page 26: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

Faktyczna implementacja w PHP

function złaczone($słowa) {switch(count($słowa)) {case 0:

return ”;case 1:

return array_pop($a);default:

$ostatnie = array_pop($słowa);return implode(’, ’, $słowa)

. ’ i ’ . $ostatnie;}

}

Maciek Godek Programowanie funkcyjne w PHP

Page 27: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

Kolejna zagadka!

Jak posortowac tablice stringóww PHP według ich długosci?

Maciek Godek Programowanie funkcyjne w PHP

Page 28: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

Kolejna zagadka!

Jak posortowac tablice stringóww PHP według ich długosci?

Maciek Godek Programowanie funkcyjne w PHP

Page 29: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

Pierwsza próba:

usort($tablica, function($a, $b) {return length($a) - length($b);

});

Pytanie: czy powyzsze wywołanie posortuje tablicerosnaco, czy malejaco?

Maciek Godek Programowanie funkcyjne w PHP

Page 30: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

Pierwsza próba:

usort($tablica, function($a, $b) {return length($a) - length($b);

});

Pytanie: czy powyzsze wywołanie posortuje tablicerosnaco, czy malejaco?

Maciek Godek Programowanie funkcyjne w PHP

Page 31: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

Druga próba:

usort($tablica, ascending(’length’)) ,

gdzie

function ascending($property) {return function($a, $b) use($property) {

return $property($a) - $property($b);};

}

Maciek Godek Programowanie funkcyjne w PHP

Page 32: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

Druga próba:

usort($tablica, ascending(’length’)) ,

gdzie

function ascending($property) {return function($a, $b) use($property) {

return $property($a) - $property($b);};

}

Maciek Godek Programowanie funkcyjne w PHP

Page 33: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

Sortowanie malejaco

function descending ($prop) {return function($a, $b) use($prop) {

return -call_user_func(ascending($prop),$a, $b);

};}

jezeli is_callable($f),to zapis call_user_func($f, $argumenty ...)jest równowazny zapisowi $f($argumenty ...)

Maciek Godek Programowanie funkcyjne w PHP

Page 34: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

Sortowanie malejaco

function descending ($prop) {return function($a, $b) use($prop) {

return -call_user_func(ascending($prop),$a, $b);

};}

jezeli is_callable($f),to zapis call_user_func($f, $argumenty ...)jest równowazny zapisowi $f($argumenty ...)

Maciek Godek Programowanie funkcyjne w PHP

Page 35: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

Popularne funkcje wyzszego rzedu

• call_user_func_array($function, $array)

• array_map($callback, $a1, $a2, ...)

• array_filter($array, $callback)

• array_reduce($callback, $array [, $init])

Maciek Godek Programowanie funkcyjne w PHP

Page 36: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

Popularne funkcje wyzszego rzedu

• call_user_func_array($function, $array)

• array_map($callback, $a1, $a2, ...)

• array_filter($array, $callback)

• array_reduce($callback, $array [, $init])

Maciek Godek Programowanie funkcyjne w PHP

Page 37: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

Popularne funkcje wyzszego rzedu

• call_user_func_array($function, $array)

• array_map($callback, $a1, $a2, ...)

• array_filter($array, $callback)

• array_reduce($callback, $array [, $init])

Maciek Godek Programowanie funkcyjne w PHP

Page 38: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

Popularne funkcje wyzszego rzedu

• call_user_func_array($function, $array)

• array_map($callback, $a1, $a2, ...)

• array_filter($array, $callback)

• array_reduce($callback, $array [, $init])

Maciek Godek Programowanie funkcyjne w PHP

Page 39: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

call_user_func_array – synonimy 1

Zastosowanie call_user_func_array – tworzeniesynonimów:

function apply() {return call_user_func_array(

’call_user_func_array’,func_get_args()

);}

Maciek Godek Programowanie funkcyjne w PHP

Page 40: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

call_user_func_array – synonimy 1

Zastosowanie call_user_func_array – tworzeniesynonimów:

function apply() {return call_user_func_array(

’call_user_func_array’,func_get_args()

);}

Maciek Godek Programowanie funkcyjne w PHP

Page 41: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

call_user_func_array – synonimy 2

Zastosowanie call_user_func_array – tworzeniesynonimów:

function map() {return apply(’array_map’, func_get_args());

}

function filter() {return apply(’array_filter’, func_get_args());

}

function reduce() {return apply(’array_reduce’, func_get_args());

}Maciek Godek Programowanie funkcyjne w PHP

Page 42: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

call_user_func_array – synonimy 2

Zastosowanie call_user_func_array – tworzeniesynonimów:

function map() {return apply(’array_map’, func_get_args());

}

function filter() {return apply(’array_filter’, func_get_args());

}

function reduce() {return apply(’array_reduce’, func_get_args());

}Maciek Godek Programowanie funkcyjne w PHP

Page 43: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

call_user_func_array – synonimy 2

Zastosowanie call_user_func_array – tworzeniesynonimów:

function map() {return apply(’array_map’, func_get_args());

}

function filter() {return apply(’array_filter’, func_get_args());

}

function reduce() {return apply(’array_reduce’, func_get_args());

}Maciek Godek Programowanie funkcyjne w PHP

Page 44: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

call_user_func_array – synonimy 2

Zastosowanie call_user_func_array – tworzeniesynonimów:

function map() {return apply(’array_map’, func_get_args());

}

function filter() {return apply(’array_filter’, func_get_args());

}

function reduce() {return apply(’array_reduce’, func_get_args());

}Maciek Godek Programowanie funkcyjne w PHP

Page 45: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

call_user_func_array – synonimy 3

Zastosowanie call_user_func_array do tworzeniasynonimów – problemy:

• brak argumentów formalnych – utrudnia współprace z IDE• brak obsługi referencjifunction pop() {

return apply(’array_pop’, func_get_args());} // zle!!!

• generuje narzuty wywołan (kod działa wolniej)• a co z obsługa argumentów domyslnych?

Maciek Godek Programowanie funkcyjne w PHP

Page 46: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

call_user_func_array – synonimy 3

Zastosowanie call_user_func_array do tworzeniasynonimów – problemy:

• brak argumentów formalnych – utrudnia współprace z IDE• brak obsługi referencjifunction pop() {

return apply(’array_pop’, func_get_args());} // zle!!!

• generuje narzuty wywołan (kod działa wolniej)• a co z obsługa argumentów domyslnych?

Maciek Godek Programowanie funkcyjne w PHP

Page 47: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

call_user_func_array – synonimy 3

Zastosowanie call_user_func_array do tworzeniasynonimów – problemy:

• brak argumentów formalnych – utrudnia współprace z IDE• brak obsługi referencjifunction pop() {

return apply(’array_pop’, func_get_args());} // zle!!!

• generuje narzuty wywołan (kod działa wolniej)• a co z obsługa argumentów domyslnych?

Maciek Godek Programowanie funkcyjne w PHP

Page 48: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

call_user_func_array – synonimy 3

Zastosowanie call_user_func_array do tworzeniasynonimów – problemy:

• brak argumentów formalnych – utrudnia współprace z IDE• brak obsługi referencjifunction pop() {

return apply(’array_pop’, func_get_args());} // zle!!!

• generuje narzuty wywołan (kod działa wolniej)• a co z obsługa argumentów domyslnych?

Maciek Godek Programowanie funkcyjne w PHP

Page 49: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

call_user_func_array – synonimy 3

Zastosowanie call_user_func_array do tworzeniasynonimów – problemy:

• brak argumentów formalnych – utrudnia współprace z IDE• brak obsługi referencjifunction pop() {

return apply(’array_pop’, func_get_args());} // zle!!!

• generuje narzuty wywołan (kod działa wolniej)• a co z obsługa argumentów domyslnych?

Maciek Godek Programowanie funkcyjne w PHP

Page 50: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

call_user_func_array – synonimy 3

Zastosowanie call_user_func_array do tworzeniasynonimów – problemy:

• brak argumentów formalnych – utrudnia współprace z IDE• brak obsługi referencjifunction pop() {

return apply(’array_pop’, func_get_args());} // zle!!!

• generuje narzuty wywołan (kod działa wolniej)• a co z obsługa argumentów domyslnych?

Maciek Godek Programowanie funkcyjne w PHP

Page 51: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

call_user_func_array – synonimy 4

Zagadka: jak stworzyc synonim dla func_get_args?

Maciek Godek Programowanie funkcyjne w PHP

Page 52: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

array_map – przykład

map: odwzorowanie zbioru funkcja. Na przykład, chcac usunacbiałe znaki ze stringów bedacych elementami tablicy przypomocy funkcji trim, mozemy napisac:

$ogolone_napisy = map(’trim’, $napisy)

Maciek Godek Programowanie funkcyjne w PHP

Page 53: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

array_map – przykład

map: odwzorowanie zbioru funkcja. Na przykład, chcac usunacbiałe znaki ze stringów bedacych elementami tablicy przypomocy funkcji trim, mozemy napisac:

$ogolone_napisy = map(’trim’, $napisy)

Maciek Godek Programowanie funkcyjne w PHP

Page 54: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

array_map – zagadka

Zagadka: Chcemy wiedziec, jaka jest najwieksza długoscstringu w danej tablicy (stringów).

Maciek Godek Programowanie funkcyjne w PHP

Page 55: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

array_map – rozwiazanie

Rozwiazanie: max(map(’length’, $tablica))

Uwaga! To jest po prostu zdanie „najwieksza sposród długoscielementów w $tablicy” wyrazone w PHP!

Maciek Godek Programowanie funkcyjne w PHP

Page 56: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

array_map – rozwiazanie

Rozwiazanie: max(map(’length’, $tablica))

Uwaga! To jest po prostu zdanie „najwieksza sposród długoscielementów w $tablicy” wyrazone w PHP!

Maciek Godek Programowanie funkcyjne w PHP

Page 57: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

array_map – ciekawostka

Ciekawostka:map(’f’, map(’g’, $a)) = map(’f’ ◦ ’g’, $a),gdzie symbol ◦ oznacza złozenie funkcji, tj. f (g(x))

Zadanie: napisz funkcje ’compose’, która pobiera jakoargumenty funkcje jednoargumentowe i zwraca funkcje bedacaich złozeniem

Maciek Godek Programowanie funkcyjne w PHP

Page 58: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

array_map – ciekawostka

Ciekawostka:map(’f’, map(’g’, $a)) = map(’f’ ◦ ’g’, $a),gdzie symbol ◦ oznacza złozenie funkcji, tj. f (g(x))

Zadanie: napisz funkcje ’compose’, która pobiera jakoargumenty funkcje jednoargumentowe i zwraca funkcje bedacaich złozeniem

Maciek Godek Programowanie funkcyjne w PHP

Page 59: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

array_filter – przykład

filter: odsiewanie elementów spełniajacych dane kryterium,np. chcemy znalezc wszystkie liczby z danej tablicy,mieszczace sie w przedziale (2, 5)

$liczby_2_5 = filter($rózne_liczby, function($x) {return (2 < $x) && ($x < 5);

});

Maciek Godek Programowanie funkcyjne w PHP

Page 60: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

array_filter – przykład

filter: odsiewanie elementów spełniajacych dane kryterium,np. chcemy znalezc wszystkie liczby z danej tablicy,mieszczace sie w przedziale (2, 5)

$liczby_2_5 = filter($rózne_liczby, function($x) {return (2 < $x) && ($x < 5);

});

Maciek Godek Programowanie funkcyjne w PHP

Page 61: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

array_filter – przykład

filter: odsiewanie elementów spełniajacych dane kryterium,np. chcemy znalezc wszystkie liczby z danej tablicy,mieszczace sie w przedziale (2, 5)

$liczby_2_5 = filter($rózne_liczby, function($x) {return (2 < $x) && ($x < 5);

});

Maciek Godek Programowanie funkcyjne w PHP

Page 62: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

array_reduce – wzmianka

reduce: funkcyjna bestiazastosowanie: uogólnianie dwuargumentowych działanłacznych na dowolna ilosc argumentów

Maciek Godek Programowanie funkcyjne w PHP

Page 63: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

array_reduce – wzmianka

reduce: funkcyjna bestiazastosowanie: uogólnianie dwuargumentowych działanłacznych na dowolna ilosc argumentów

Maciek Godek Programowanie funkcyjne w PHP

Page 64: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

Składnia $_

Problem: mamy tablice obiektów. Chcielibysmy miec tablicerzutów tych obiektów na ich pewne własnosci, które mozemyotrzymac przez wywołanie odpowiedniej metody.Klasyczne rozwiazanie:

$rzuty = [];foreach($obiekty as $obiekt) {

$rzuty[] = $obiekt->pobierzWłasnosc();}

Funkcyjne rozwiazanie:

global $_; // drobne oszustwo$rzuty = map($_->pobierzWłasnosc(), $obiekty);

Maciek Godek Programowanie funkcyjne w PHP

Page 65: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

Składnia $_

Problem: mamy tablice obiektów. Chcielibysmy miec tablicerzutów tych obiektów na ich pewne własnosci, które mozemyotrzymac przez wywołanie odpowiedniej metody.Klasyczne rozwiazanie:

$rzuty = [];foreach($obiekty as $obiekt) {

$rzuty[] = $obiekt->pobierzWłasnosc();}

Funkcyjne rozwiazanie:

global $_; // drobne oszustwo$rzuty = map($_->pobierzWłasnosc(), $obiekty);

Maciek Godek Programowanie funkcyjne w PHP

Page 66: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

Składnia $_

Problem: mamy tablice obiektów. Chcielibysmy miec tablicerzutów tych obiektów na ich pewne własnosci, które mozemyotrzymac przez wywołanie odpowiedniej metody.Klasyczne rozwiazanie:

$rzuty = [];foreach($obiekty as $obiekt) {

$rzuty[] = $obiekt->pobierzWłasnosc();}

Funkcyjne rozwiazanie:

global $_; // drobne oszustwo$rzuty = map($_->pobierzWłasnosc(), $obiekty);

Maciek Godek Programowanie funkcyjne w PHP

Page 67: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

Składnia $_

Problem: mamy tablice obiektów. Chcielibysmy miec tablicerzutów tych obiektów na ich pewne własnosci, które mozemyotrzymac przez wywołanie odpowiedniej metody.Klasyczne rozwiazanie:

$rzuty = [];foreach($obiekty as $obiekt) {

$rzuty[] = $obiekt->pobierzWłasnosc();}

Funkcyjne rozwiazanie:

global $_; // drobne oszustwo$rzuty = map($_->pobierzWłasnosc(), $obiekty);

Maciek Godek Programowanie funkcyjne w PHP

Page 68: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

Składnia $_

Inny problem: sortowanie tablicy tablic wzgledem danejkolumny:usort($array, ascending($_[’column’]));

Maciek Godek Programowanie funkcyjne w PHP

Page 69: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

SpójnikiSortowanie tablicyInne funkcje wyzszego rzeduŁaczenie OOP i FP

Składnia $_

Inny problem: sortowanie tablicy tablic wzgledem danejkolumny:usort($array, ascending($_[’column’]));

Maciek Godek Programowanie funkcyjne w PHP

Page 70: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

Podsumowanie

Zalety FP:• łatwiejsza analiza kodu• dobra kompozycjonalnosc (nie trzeba sie przejmowac

kopiowaniem i referencjami)• bardzo naturalne testowanie• uproszczona paralelizacja

Wady FP:• nie wszedzie daje sie stosowac• brak wsparcia ze strony narzedzi• kod moze działac niewydajnie

Maciek Godek Programowanie funkcyjne w PHP

Page 71: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

Podsumowanie

Zalety FP:• łatwiejsza analiza kodu• dobra kompozycjonalnosc (nie trzeba sie przejmowac

kopiowaniem i referencjami)• bardzo naturalne testowanie• uproszczona paralelizacja

Wady FP:• nie wszedzie daje sie stosowac• brak wsparcia ze strony narzedzi• kod moze działac niewydajnie

Maciek Godek Programowanie funkcyjne w PHP

Page 72: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

Podsumowanie

Zalety FP:• łatwiejsza analiza kodu• dobra kompozycjonalnosc (nie trzeba sie przejmowac

kopiowaniem i referencjami)• bardzo naturalne testowanie• uproszczona paralelizacja

Wady FP:• nie wszedzie daje sie stosowac• brak wsparcia ze strony narzedzi• kod moze działac niewydajnie

Maciek Godek Programowanie funkcyjne w PHP

Page 73: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

Podsumowanie

Zalety FP:• łatwiejsza analiza kodu• dobra kompozycjonalnosc (nie trzeba sie przejmowac

kopiowaniem i referencjami)• bardzo naturalne testowanie• uproszczona paralelizacja

Wady FP:• nie wszedzie daje sie stosowac• brak wsparcia ze strony narzedzi• kod moze działac niewydajnie

Maciek Godek Programowanie funkcyjne w PHP

Page 74: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

Podsumowanie

Zalety FP:• łatwiejsza analiza kodu• dobra kompozycjonalnosc (nie trzeba sie przejmowac

kopiowaniem i referencjami)• bardzo naturalne testowanie• uproszczona paralelizacja

Wady FP:• nie wszedzie daje sie stosowac• brak wsparcia ze strony narzedzi• kod moze działac niewydajnie

Maciek Godek Programowanie funkcyjne w PHP

Page 75: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

Podsumowanie

Zalety FP:• łatwiejsza analiza kodu• dobra kompozycjonalnosc (nie trzeba sie przejmowac

kopiowaniem i referencjami)• bardzo naturalne testowanie• uproszczona paralelizacja

Wady FP:• nie wszedzie daje sie stosowac• brak wsparcia ze strony narzedzi• kod moze działac niewydajnie

Maciek Godek Programowanie funkcyjne w PHP

Page 76: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

Podsumowanie

Zalety FP:• łatwiejsza analiza kodu• dobra kompozycjonalnosc (nie trzeba sie przejmowac

kopiowaniem i referencjami)• bardzo naturalne testowanie• uproszczona paralelizacja

Wady FP:• nie wszedzie daje sie stosowac• brak wsparcia ze strony narzedzi• kod moze działac niewydajnie

Maciek Godek Programowanie funkcyjne w PHP

Page 77: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

Podsumowanie

Zalety FP:• łatwiejsza analiza kodu• dobra kompozycjonalnosc (nie trzeba sie przejmowac

kopiowaniem i referencjami)• bardzo naturalne testowanie• uproszczona paralelizacja

Wady FP:• nie wszedzie daje sie stosowac• brak wsparcia ze strony narzedzi• kod moze działac niewydajnie

Maciek Godek Programowanie funkcyjne w PHP

Page 78: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

Podsumowanie

Zalety FP:• łatwiejsza analiza kodu• dobra kompozycjonalnosc (nie trzeba sie przejmowac

kopiowaniem i referencjami)• bardzo naturalne testowanie• uproszczona paralelizacja

Wady FP:• nie wszedzie daje sie stosowac• brak wsparcia ze strony narzedzi• kod moze działac niewydajnie

Maciek Godek Programowanie funkcyjne w PHP

Page 79: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

Podsumowanie

Zalety FP:• łatwiejsza analiza kodu• dobra kompozycjonalnosc (nie trzeba sie przejmowac

kopiowaniem i referencjami)• bardzo naturalne testowanie• uproszczona paralelizacja

Wady FP:• nie wszedzie daje sie stosowac• brak wsparcia ze strony narzedzi• kod moze działac niewydajnie

Maciek Godek Programowanie funkcyjne w PHP

Page 80: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

Lektury

Wpiszcie sobie w Google:John Carmack Functional Programming

Ksiazki:„Struktura i Interpretacja Programów Komputerowych”,H. Abelson, G. Sussman

Maciek Godek Programowanie funkcyjne w PHP

Page 81: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

Lektury

Wpiszcie sobie w Google:John Carmack Functional Programming

Ksiazki:„Struktura i Interpretacja Programów Komputerowych”,H. Abelson, G. Sussman

Maciek Godek Programowanie funkcyjne w PHP

Page 82: PHP meetup#4 Godek

WprowadzeniePrzykłady

Podsumowanie

Dziekuje!

https://joind.in/[email protected]

Maciek Godek Programowanie funkcyjne w PHP