SlideShare a Scribd company logo
1 of 82
Download to read offline
Wprowadzenie
Przykłady
Podsumowanie

Programowanie funkcyjne w PHP
Maciek Godek
{ fido : labs }
godek.maciek@gmail.com

PHP3City Meetup#4, 06.12.2013

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Czym jest programowanie funkcyjne?
Dlaczego zainteresowa´ sie FP?
c ˛

Czym jest programowanie funkcyjne?

Programowanie funkcyjne (FP) polega na:
• unikaniu skutków ubocznych,
• stosowaniu funkcji wy˙ szego rz˛
z
edu.

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Czym jest programowanie funkcyjne?
Dlaczego zainteresowa´ sie FP?
c ˛

Czym jest programowanie funkcyjne?

Programowanie funkcyjne (FP) polega na:
• unikaniu skutków ubocznych,
• stosowaniu funkcji wy˙ szego rz˛
z
edu.

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Czym jest programowanie funkcyjne?
Dlaczego zainteresowa´ sie FP?
c ˛

Czym jest programowanie funkcyjne?

Programowanie funkcyjne (FP) polega na:
• unikaniu skutków ubocznych,
• stosowaniu funkcji wy˙ szego rz˛
z
edu.

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Czym jest programowanie funkcyjne?
Dlaczego zainteresowa´ sie FP?
c ˛

Sformułowanie problemu

Jaki problem chcemy rozwiazac?
˛ ´
- Uczyni´ programowanie jak maksymalnie efektywnym, czyli:
c
• musie´ jak najmniej pamieta´ , oraz
c
˛ c
• móc jak najwiecej wnioskowa´ .
˛
c

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Czym jest programowanie funkcyjne?
Dlaczego zainteresowa´ sie FP?
c ˛

Sformułowanie problemu

Jaki problem chcemy rozwiazac?
˛ ´
- Uczyni´ programowanie jak maksymalnie efektywnym, czyli:
c
• musie´ jak najmniej pamieta´ , oraz
c
˛ c
• móc jak najwiecej wnioskowa´ .
˛
c

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Czym jest programowanie funkcyjne?
Dlaczego zainteresowa´ sie FP?
c ˛

Sformułowanie problemu

Jaki problem chcemy rozwiazac?
˛ ´
- Uczyni´ programowanie jak maksymalnie efektywnym, czyli:
c
• musie´ jak najmniej pamieta´ , oraz
c
˛ c
• móc jak najwiecej wnioskowa´ .
˛
c

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Czym jest programowanie funkcyjne?
Dlaczego zainteresowa´ sie FP?
c ˛

Sformułowanie problemu

Jaki problem chcemy rozwiazac?
˛ ´
- Uczyni´ programowanie jak maksymalnie efektywnym, czyli:
c
• musie´ jak najmniej pamieta´ , oraz
c
˛ c
• móc jak najwiecej wnioskowa´ .
˛
c

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Czym jest programowanie funkcyjne?
Dlaczego zainteresowa´ sie FP?
c ˛

Sformułowanie problemu

´
Innymi słowy: uczynic program jak najbardziej czytelnym

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Czym jest programowanie funkcyjne?
Dlaczego zainteresowa´ sie FP?
c ˛

Sformułowanie problemu

´
Innymi słowy: uczynic program jak najbardziej czytelnym

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Czym jest programowanie funkcyjne?
Dlaczego zainteresowa´ sie FP?
c ˛

Sposoby na usprawnienie pracy z kodem

Pomysły:
• korzystanie z Integrated Development Environment
• u˙ ywanie statycznej kontroli typów
z
• stosowanie konwencji w nazewnictwie obiektów
• ogólniej: przestrzeganie konwencji w sposobie u˙ ycja
z

jezyka
˛

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Czym jest programowanie funkcyjne?
Dlaczego zainteresowa´ sie FP?
c ˛

Sposoby na usprawnienie pracy z kodem

Pomysły:
• korzystanie z Integrated Development Environment
• u˙ ywanie statycznej kontroli typów
z
• stosowanie konwencji w nazewnictwie obiektów
• ogólniej: przestrzeganie konwencji w sposobie u˙ ycja
z

jezyka
˛

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Czym jest programowanie funkcyjne?
Dlaczego zainteresowa´ sie FP?
c ˛

Sposoby na usprawnienie pracy z kodem

Pomysły:
• korzystanie z Integrated Development Environment
• u˙ ywanie statycznej kontroli typów
z
• stosowanie konwencji w nazewnictwie obiektów
• ogólniej: przestrzeganie konwencji w sposobie u˙ ycja
z

jezyka
˛

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Czym jest programowanie funkcyjne?
Dlaczego zainteresowa´ sie FP?
c ˛

Sposoby na usprawnienie pracy z kodem

Pomysły:
• korzystanie z Integrated Development Environment
• u˙ ywanie statycznej kontroli typów
z
• stosowanie konwencji w nazewnictwie obiektów
• ogólniej: przestrzeganie konwencji w sposobie u˙ ycja
z

jezyka
˛

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Czym jest programowanie funkcyjne?
Dlaczego zainteresowa´ sie FP?
c ˛

Sposoby na usprawnienie pracy z kodem

Pomysły:
• korzystanie z Integrated Development Environment
• u˙ ywanie statycznej kontroli typów
z
• stosowanie konwencji w nazewnictwie obiektów
• ogólniej: przestrzeganie konwencji w sposobie u˙ ycja
z

jezyka
˛

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Czym jest programowanie funkcyjne?
Dlaczego zainteresowa´ sie FP?
c ˛

Konwencje w sposobie u˙ ycia jezyka
z
˛

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

polimorfizm, dziedziczenie, ...)
• programowanie funkcyjne

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Czym jest programowanie funkcyjne?
Dlaczego zainteresowa´ sie FP?
c ˛

Konwencje w sposobie u˙ ycia jezyka
z
˛

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

polimorfizm, dziedziczenie, ...)
• programowanie funkcyjne

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Czym jest programowanie funkcyjne?
Dlaczego zainteresowa´ sie FP?
c ˛

Konwencje w sposobie u˙ ycia jezyka
z
˛

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

polimorfizm, dziedziczenie, ...)
• programowanie funkcyjne

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Czym jest programowanie funkcyjne?
Dlaczego zainteresowa´ sie FP?
c ˛

Konwencje w sposobie u˙ ycia jezyka
z
˛

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

polimorfizm, dziedziczenie, ...)
• programowanie funkcyjne

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

Zagadka: co robi poni˙ szy kod?
z
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
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

Zagadka: co robi poni˙ szy kod?
z
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
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Ł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 wszystkie
˛
słowa przecinkami, za wyjatkiem dwóch ostatnich, które
˛
sklejamy spójnikiem ’i’.

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

Przykład u˙ ycia
z

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
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Ł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
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

W strone PHP
˛
function złaczone($słowa) { // marze´
˛
n
match($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
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Ł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
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

Kolejna zagadka!

Jak posortowa´ tablice stringów
c
˛
w PHP według ich długo´ ci?
s

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

Kolejna zagadka!

Jak posortowa´ tablice stringów
c
˛
s
w PHP według ich długo´ ci?

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

Pierwsza próba:

usort($tablica, function($a, $b) {
return length($a) - length($b);
});
Pytanie: czy powy˙ sze wywołanie posortuje tablice
z
˛
rosnaco, czy malejaco?
˛
˛

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

Pierwsza próba:

usort($tablica, function($a, $b) {
return length($a) - length($b);
});
Pytanie: czy powy˙ sze wywołanie posortuje tablice
z
˛
rosnaco, czy malejaco?
˛
˛

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Ł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
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Ł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
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

Sortowanie malejaco
˛

function descending ($prop) {
return function($a, $b) use($prop) {
return -call_user_func(ascending($prop),
$a, $b);
};
}
je˙ eli is_callable($f),
z
to zapis call_user_func($f, $argumenty ...)
jest równowa˙ ny zapisowi $f($argumenty ...)
z

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

Sortowanie malejaco
˛

function descending ($prop) {
return function($a, $b) use($prop) {
return -call_user_func(ascending($prop),
$a, $b);
};
}
je˙ eli is_callable($f),
z
to zapis call_user_func($f, $argumenty ...)
jest równowa˙ ny zapisowi $f($argumenty ...)
z

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

Popularne funkcje wy˙ szego rz˛
z
edu

• 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
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

Popularne funkcje wy˙ szego rz˛
z
edu

• 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
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

Popularne funkcje wy˙ szego rz˛
z
edu

• 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
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

Popularne funkcje wy˙ szego rz˛
z
edu

• 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
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

call_user_func_array – synonimy 1
Zastosowanie call_user_func_array – tworzenie
synonimów:
function apply() {
return call_user_func_array(
’call_user_func_array’,
func_get_args()
);
}

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

call_user_func_array – synonimy 1
Zastosowanie call_user_func_array – tworzenie
synonimów:
function apply() {
return call_user_func_array(
’call_user_func_array’,
func_get_args()
);
}

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

call_user_func_array – synonimy 2
Zastosowanie call_user_func_array – tworzenie
synonimó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
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

call_user_func_array – synonimy 2
Zastosowanie call_user_func_array – tworzenie
synonimó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
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

call_user_func_array – synonimy 2
Zastosowanie call_user_func_array – tworzenie
synonimó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
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

call_user_func_array – synonimy 2
Zastosowanie call_user_func_array – tworzenie
synonimó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
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

call_user_func_array – synonimy 3
Zastosowanie call_user_func_array do tworzenia
synonimów – problemy:
• brak argumentów formalnych – utrudnia współprace z IDE
˛
• brak obsługi referencji

function pop() {
return apply(’array_pop’, func_get_args());
} // ´le!!!
z
• generuje narzuty wywołan (kod działa wolniej)
´
• a co z obsługa argumentów domy´ lnych?
˛
s

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

call_user_func_array – synonimy 3
Zastosowanie call_user_func_array do tworzenia
synonimów – problemy:
• brak argumentów formalnych – utrudnia współprace z IDE
˛
• brak obsługi referencji

function pop() {
return apply(’array_pop’, func_get_args());
} // ´le!!!
z
• generuje narzuty wywołan (kod działa wolniej)
´
• a co z obsługa argumentów domy´ lnych?
˛
s

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

call_user_func_array – synonimy 3
Zastosowanie call_user_func_array do tworzenia
synonimów – problemy:
• brak argumentów formalnych – utrudnia współprace z IDE
˛
• brak obsługi referencji

function pop() {
return apply(’array_pop’, func_get_args());
} // ´le!!!
z
• generuje narzuty wywołan (kod działa wolniej)
´
• a co z obsługa argumentów domy´ lnych?
˛
s

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

call_user_func_array – synonimy 3
Zastosowanie call_user_func_array do tworzenia
synonimów – problemy:
• brak argumentów formalnych – utrudnia współprace z IDE
˛
• brak obsługi referencji

function pop() {
return apply(’array_pop’, func_get_args());
} // ´le!!!
z
• generuje narzuty wywołan (kod działa wolniej)
´
• a co z obsługa argumentów domy´ lnych?
˛
s

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

call_user_func_array – synonimy 3
Zastosowanie call_user_func_array do tworzenia
synonimów – problemy:
• brak argumentów formalnych – utrudnia współprace z IDE
˛
• brak obsługi referencji

function pop() {
return apply(’array_pop’, func_get_args());
} // ´le!!!
z
• generuje narzuty wywołan (kod działa wolniej)
´
• a co z obsługa argumentów domy´ lnych?
˛
s

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

call_user_func_array – synonimy 3
Zastosowanie call_user_func_array do tworzenia
synonimów – problemy:
• brak argumentów formalnych – utrudnia współprace z IDE
˛
• brak obsługi referencji

function pop() {
return apply(’array_pop’, func_get_args());
} // ´le!!!
z
• generuje narzuty wywołan (kod działa wolniej)
´
• a co z obsługa argumentów domy´ lnych?
˛
s

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

call_user_func_array – synonimy 4

´
Zagadka: jak stworzyc synonim dla func_get_args?

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

array_map – przykład

map: odwzorowanie zbioru funkcja. Na przykład, chcac usuna´
˛
˛
˛c
białe znaki ze stringów bedacych elementami tablicy przy
˛ ˛
pomocy funkcji trim, mo˙ emy napisa´ :
z
c
$ogolone_napisy = map(’trim’, $napisy)

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

array_map – przykład

˛
˛c
map: odwzorowanie zbioru funkcja. Na przykład, chcac usuna´
˛
białe znaki ze stringów bedacych elementami tablicy przy
˛ ˛
pomocy funkcji trim, mo˙ emy napisa´ :
z
c
$ogolone_napisy = map(’trim’, $napisy)

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

array_map – zagadka

´
´´
Zagadka: Chcemy wiedziec, jaka jest najwieksza długosc
˛
stringu w danej tablicy (stringów).

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

array_map – rozwiazanie
˛

Rozwiazanie: max(map(’length’, $tablica))
˛
Uwaga! To jest po prostu zdanie „najwieksza spo´ ród długo´ ci
˛
s
s
elementów w $tablicy” wyra˙ one w PHP!
z

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

array_map – rozwiazanie
˛

Rozwiazanie: max(map(’length’, $tablica))
˛
Uwaga! To jest po prostu zdanie „najwieksza spo´ ród długo´ ci
˛
s
s
elementów w $tablicy” wyra˙ one w PHP!
z

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

array_map – ciekawostka

Ciekawostka:
map(’f’, map(’g’, $a)) = map(’f’ ◦ ’g’, $a),
gdzie symbol ◦ oznacza zło˙ enie funkcji, tj. f (g(x))
z
Zadanie: napisz funkcje ’compose’, która pobiera jako
˛
argumenty funkcje jednoargumentowe i zwraca funkcje bedaca
˛ ˛ ˛ ˛
ich zło˙ eniem
z

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

array_map – ciekawostka

Ciekawostka:
map(’f’, map(’g’, $a)) = map(’f’ ◦ ’g’, $a),
gdzie symbol ◦ oznacza zło˙ enie funkcji, tj. f (g(x))
z
Zadanie: napisz funkcje ’compose’, która pobiera jako
˛
argumenty funkcje jednoargumentowe i zwraca funkcje bedaca
˛ ˛ ˛ ˛
ich zło˙ eniem
z

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

array_filter – przykład

filter: odsiewanie elementów spełniajacych dane kryterium,
˛
np. chcemy znale´ c wszystkie liczby z danej tablicy,
z´
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
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

array_filter – przykład

filter: odsiewanie elementów spełniajacych dane kryterium,
˛
np. chcemy znale´ c wszystkie liczby z danej tablicy,
z´
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
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

array_filter – przykład

filter: odsiewanie elementów spełniajacych dane kryterium,
˛
np. chcemy znale´ c wszystkie liczby z danej tablicy,
z´
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
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

array_reduce – wzmianka

reduce: funkcyjna bestia
´
zastosowanie: uogólnianie dwuargumentowych działan
łacznych na dowolna ilo´ c argumentów
˛
˛ s´

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

array_reduce – wzmianka

reduce: funkcyjna bestia
´
zastosowanie: uogólnianie dwuargumentowych działan
łacznych na dowolna ilo´ c argumentów
˛
˛ s´

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

Składnia $_
Problem: mamy tablice obiektów. Chcieliby´ my mie´ tablice
˛
s
c
˛
rzutów tych obiektów na ich pewne własno´ ci, które mo˙ emy
s
z
otrzyma´ przez wywołanie odpowiedniej metody.
c
Klasyczne rozwiazanie:
˛
$rzuty = [];
foreach($obiekty as $obiekt) {
$rzuty[] = $obiekt->pobierzWłasno´´();
sc
}
Funkcyjne rozwiazanie:
˛
global $_; // drobne oszustwo
$rzuty = map($_->pobierzWłasno´´(), $obiekty);
sc
Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

Składnia $_
Problem: mamy tablice obiektów. Chcieliby´ my mie´ tablice
˛
s
c
˛
rzutów tych obiektów na ich pewne własno´ ci, które mo˙ emy
s
z
otrzyma´ przez wywołanie odpowiedniej metody.
c
Klasyczne rozwiazanie:
˛
$rzuty = [];
foreach($obiekty as $obiekt) {
$rzuty[] = $obiekt->pobierzWłasno´´();
sc
}
Funkcyjne rozwiazanie:
˛
global $_; // drobne oszustwo
$rzuty = map($_->pobierzWłasno´´(), $obiekty);
sc
Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

Składnia $_
Problem: mamy tablice obiektów. Chcieliby´ my mie´ tablice
˛
s
c
˛
rzutów tych obiektów na ich pewne własno´ ci, które mo˙ emy
s
z
otrzyma´ przez wywołanie odpowiedniej metody.
c
Klasyczne rozwiazanie:
˛
$rzuty = [];
foreach($obiekty as $obiekt) {
$rzuty[] = $obiekt->pobierzWłasno´´();
sc
}
Funkcyjne rozwiazanie:
˛
global $_; // drobne oszustwo
$rzuty = map($_->pobierzWłasno´´(), $obiekty);
sc
Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

Składnia $_
Problem: mamy tablice obiektów. Chcieliby´ my mie´ tablice
˛
s
c
˛
rzutów tych obiektów na ich pewne własno´ ci, które mo˙ emy
s
z
otrzyma´ przez wywołanie odpowiedniej metody.
c
Klasyczne rozwiazanie:
˛
$rzuty = [];
foreach($obiekty as $obiekt) {
$rzuty[] = $obiekt->pobierzWłasno´´();
sc
}
Funkcyjne rozwiazanie:
˛
global $_; // drobne oszustwo
$rzuty = map($_->pobierzWłasno´´(), $obiekty);
sc
Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

Składnia $_

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

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Spójniki
Sortowanie tablicy
Inne funkcje wy˙ szego rz˛
z
edu
Łaczenie OOP i FP
˛

Składnia $_

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

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Podsumowanie
Zalety FP:
• łatwiejsza analiza kodu
• dobra kompozycjonalno´ c (nie trzeba sie przejmowa´
s´
˛
c

kopiowaniem i referencjami)
• bardzo naturalne testowanie
• uproszczona paralelizacja

Wady FP:
• nie wsz˛
edzie daje sie stosowa´
˛
c
• brak wsparcia ze strony narz˛
edzi
• kod mo˙ e działa´ niewydajnie
z
c

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Podsumowanie
Zalety FP:
• łatwiejsza analiza kodu
• dobra kompozycjonalno´ c (nie trzeba sie przejmowa´
s´
˛
c

kopiowaniem i referencjami)
• bardzo naturalne testowanie
• uproszczona paralelizacja

Wady FP:
• nie wsz˛
edzie daje sie stosowa´
˛
c
• brak wsparcia ze strony narz˛
edzi
• kod mo˙ e działa´ niewydajnie
z
c

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Podsumowanie
Zalety FP:
• łatwiejsza analiza kodu
• dobra kompozycjonalno´ c (nie trzeba sie przejmowa´
s´
˛
c

kopiowaniem i referencjami)
• bardzo naturalne testowanie
• uproszczona paralelizacja

Wady FP:
• nie wsz˛
edzie daje sie stosowa´
˛
c
• brak wsparcia ze strony narz˛
edzi
• kod mo˙ e działa´ niewydajnie
z
c

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Podsumowanie
Zalety FP:
• łatwiejsza analiza kodu
• dobra kompozycjonalno´ c (nie trzeba sie przejmowa´
s´
˛
c

kopiowaniem i referencjami)
• bardzo naturalne testowanie
• uproszczona paralelizacja

Wady FP:
• nie wsz˛
edzie daje sie stosowa´
˛
c
• brak wsparcia ze strony narz˛
edzi
• kod mo˙ e działa´ niewydajnie
z
c

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Podsumowanie
Zalety FP:
• łatwiejsza analiza kodu
• dobra kompozycjonalno´ c (nie trzeba sie przejmowa´
s´
˛
c

kopiowaniem i referencjami)
• bardzo naturalne testowanie
• uproszczona paralelizacja

Wady FP:
• nie wsz˛
edzie daje sie stosowa´
˛
c
• brak wsparcia ze strony narz˛
edzi
• kod mo˙ e działa´ niewydajnie
z
c

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Podsumowanie
Zalety FP:
• łatwiejsza analiza kodu
• dobra kompozycjonalno´ c (nie trzeba sie przejmowa´
s´
˛
c

kopiowaniem i referencjami)
• bardzo naturalne testowanie
• uproszczona paralelizacja

Wady FP:
• nie wsz˛
edzie daje sie stosowa´
˛
c
• brak wsparcia ze strony narz˛
edzi
• kod mo˙ e działa´ niewydajnie
z
c

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Podsumowanie
Zalety FP:
• łatwiejsza analiza kodu
• dobra kompozycjonalno´ c (nie trzeba sie przejmowa´
s´
˛
c

kopiowaniem i referencjami)
• bardzo naturalne testowanie
• uproszczona paralelizacja

Wady FP:
• nie wsz˛
edzie daje sie stosowa´
˛
c
• brak wsparcia ze strony narz˛
edzi
• kod mo˙ e działa´ niewydajnie
z
c

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Podsumowanie
Zalety FP:
• łatwiejsza analiza kodu
• dobra kompozycjonalno´ c (nie trzeba sie przejmowa´
s´
˛
c

kopiowaniem i referencjami)
• bardzo naturalne testowanie
• uproszczona paralelizacja

Wady FP:
• nie wsz˛
edzie daje sie stosowa´
˛
c
• brak wsparcia ze strony narz˛
edzi
• kod mo˙ e działa´ niewydajnie
z
c

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Podsumowanie
Zalety FP:
• łatwiejsza analiza kodu
• dobra kompozycjonalno´ c (nie trzeba sie przejmowa´
s´
˛
c

kopiowaniem i referencjami)
• bardzo naturalne testowanie
• uproszczona paralelizacja

Wady FP:
• nie wsz˛
edzie daje sie stosowa´
˛
c
• brak wsparcia ze strony narz˛
edzi
• kod mo˙ e działa´ niewydajnie
z
c

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Podsumowanie
Zalety FP:
• łatwiejsza analiza kodu
• dobra kompozycjonalno´ c (nie trzeba sie przejmowa´
s´
˛
c

kopiowaniem i referencjami)
• bardzo naturalne testowanie
• uproszczona paralelizacja

Wady FP:
• nie wsz˛
edzie daje sie stosowa´
˛
c
• brak wsparcia ze strony narz˛
edzi
• kod mo˙ e działa´ niewydajnie
z
c

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Lektury

Wpiszcie sobie w Google:
John Carmack Functional Programming

Ksia˙ ki:
˛z
„Struktura i Interpretacja Programów Komputerowych”,
H. Abelson, G. Sussman

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Lektury

Wpiszcie sobie w Google:
John Carmack Functional Programming

Ksia˙ ki:
˛z
„Struktura i Interpretacja Programów Komputerowych”,
H. Abelson, G. Sussman

Maciek Godek

Programowanie funkcyjne w PHP
Wprowadzenie
Przykłady
Podsumowanie

Dziekuje!
˛
˛

https://joind.in/10258
godek.maciek@gmail.com

Maciek Godek

Programowanie funkcyjne w PHP

More Related Content

Similar to PHP meetup#4 Godek

Programowanie zorientowane aspektowo
Programowanie zorientowane aspektowoProgramowanie zorientowane aspektowo
Programowanie zorientowane aspektowoXSolve
 
JavaStart - kurs Java Podstawy
JavaStart - kurs Java PodstawyJavaStart - kurs Java Podstawy
JavaStart - kurs Java PodstawyJavaStart
 
Pair Programming Pragmatycznie - Krzysztof Szabelski
Pair Programming Pragmatycznie - Krzysztof SzabelskiPair Programming Pragmatycznie - Krzysztof Szabelski
Pair Programming Pragmatycznie - Krzysztof SzabelskiKrzysztof Szabelski
 
Architektura to nie bzdura
Architektura to nie bzduraArchitektura to nie bzdura
Architektura to nie bzduraPawel Szulc
 
Jak zacząć, aby nie żałować - czyli 50 twarzy PHP
Jak zacząć, aby nie żałować - czyli 50 twarzy PHPJak zacząć, aby nie żałować - czyli 50 twarzy PHP
Jak zacząć, aby nie żałować - czyli 50 twarzy PHPPiotr Horzycki
 
Blaski i cienie spolszczenia Drupala 8 - studium przypadku
Blaski i cienie spolszczenia Drupala 8 - studium przypadkuBlaski i cienie spolszczenia Drupala 8 - studium przypadku
Blaski i cienie spolszczenia Drupala 8 - studium przypadkuKonrad Szymczak
 
4Developers 2015: Couple of words about testing in Java, Spock and BDD - Piot...
4Developers 2015: Couple of words about testing in Java, Spock and BDD - Piot...4Developers 2015: Couple of words about testing in Java, Spock and BDD - Piot...
4Developers 2015: Couple of words about testing in Java, Spock and BDD - Piot...PROIDEA
 
PHP5. Obiekty, wzorce, narzędzia
PHP5. Obiekty, wzorce, narzędziaPHP5. Obiekty, wzorce, narzędzia
PHP5. Obiekty, wzorce, narzędziaWydawnictwo Helion
 
Pierwsze kroki w IT jako programista - Fundacja MOŻESZ ITy!
Pierwsze kroki w IT jako programista - Fundacja MOŻESZ ITy!Pierwsze kroki w IT jako programista - Fundacja MOŻESZ ITy!
Pierwsze kroki w IT jako programista - Fundacja MOŻESZ ITy!Wojciech Jureczka
 
Codeception - jak zacząć pisać automatyczne testy do Drupala [PL]
Codeception - jak zacząć pisać automatyczne testy do Drupala [PL]Codeception - jak zacząć pisać automatyczne testy do Drupala [PL]
Codeception - jak zacząć pisać automatyczne testy do Drupala [PL]Droptica
 
Szukamy dziury w całym - czyli nauka testowania oprogramowania
Szukamy dziury w całym - czyli nauka testowania oprogramowaniaSzukamy dziury w całym - czyli nauka testowania oprogramowania
Szukamy dziury w całym - czyli nauka testowania oprogramowaniatestuj.pl
 
Jak wnieść wkład w Open Source?
Jak wnieść wkład w Open Source?Jak wnieść wkład w Open Source?
Jak wnieść wkład w Open Source?Tomasz Bak
 
Najczęstsze błędy początkujących programistów PHP
Najczęstsze błędy początkujących programistów PHPNajczęstsze błędy początkujących programistów PHP
Najczęstsze błędy początkujących programistów PHPPHPstokPHPstok
 
Od frontu po backend. Dwa oblicza SOLIDnego kodu
Od frontu po backend. Dwa oblicza SOLIDnego koduOd frontu po backend. Dwa oblicza SOLIDnego kodu
Od frontu po backend. Dwa oblicza SOLIDnego koduThe Software House
 

Similar to PHP meetup#4 Godek (20)

Programowanie zorientowane aspektowo
Programowanie zorientowane aspektowoProgramowanie zorientowane aspektowo
Programowanie zorientowane aspektowo
 
JavaStart - kurs Java Podstawy
JavaStart - kurs Java PodstawyJavaStart - kurs Java Podstawy
JavaStart - kurs Java Podstawy
 
PHP5. Radocha z programowania
PHP5. Radocha z programowaniaPHP5. Radocha z programowania
PHP5. Radocha z programowania
 
Laravel/PHP - zderzenie z PDFami
Laravel/PHP - zderzenie z PDFamiLaravel/PHP - zderzenie z PDFami
Laravel/PHP - zderzenie z PDFami
 
PHP5. Tajniki programowania
PHP5. Tajniki programowaniaPHP5. Tajniki programowania
PHP5. Tajniki programowania
 
Pair Programming Pragmatycznie - Krzysztof Szabelski
Pair Programming Pragmatycznie - Krzysztof SzabelskiPair Programming Pragmatycznie - Krzysztof Szabelski
Pair Programming Pragmatycznie - Krzysztof Szabelski
 
Architektura to nie bzdura
Architektura to nie bzduraArchitektura to nie bzdura
Architektura to nie bzdura
 
Jak zacząć, aby nie żałować - czyli 50 twarzy PHP
Jak zacząć, aby nie żałować - czyli 50 twarzy PHPJak zacząć, aby nie żałować - czyli 50 twarzy PHP
Jak zacząć, aby nie żałować - czyli 50 twarzy PHP
 
Blaski i cienie spolszczenia Drupala 8 - studium przypadku
Blaski i cienie spolszczenia Drupala 8 - studium przypadkuBlaski i cienie spolszczenia Drupala 8 - studium przypadku
Blaski i cienie spolszczenia Drupala 8 - studium przypadku
 
4Developers 2015: Couple of words about testing in Java, Spock and BDD - Piot...
4Developers 2015: Couple of words about testing in Java, Spock and BDD - Piot...4Developers 2015: Couple of words about testing in Java, Spock and BDD - Piot...
4Developers 2015: Couple of words about testing in Java, Spock and BDD - Piot...
 
PHP5. Obiekty, wzorce, narzędzia
PHP5. Obiekty, wzorce, narzędziaPHP5. Obiekty, wzorce, narzędzia
PHP5. Obiekty, wzorce, narzędzia
 
Pierwsze kroki w IT jako programista - Fundacja MOŻESZ ITy!
Pierwsze kroki w IT jako programista - Fundacja MOŻESZ ITy!Pierwsze kroki w IT jako programista - Fundacja MOŻESZ ITy!
Pierwsze kroki w IT jako programista - Fundacja MOŻESZ ITy!
 
PHP. Programowanie
PHP. ProgramowaniePHP. Programowanie
PHP. Programowanie
 
Codeception - jak zacząć pisać automatyczne testy do Drupala [PL]
Codeception - jak zacząć pisać automatyczne testy do Drupala [PL]Codeception - jak zacząć pisać automatyczne testy do Drupala [PL]
Codeception - jak zacząć pisać automatyczne testy do Drupala [PL]
 
Wydajność i optymalizacja
Wydajność i optymalizacjaWydajność i optymalizacja
Wydajność i optymalizacja
 
Szukamy dziury w całym - czyli nauka testowania oprogramowania
Szukamy dziury w całym - czyli nauka testowania oprogramowaniaSzukamy dziury w całym - czyli nauka testowania oprogramowania
Szukamy dziury w całym - czyli nauka testowania oprogramowania
 
Jak wnieść wkład w Open Source?
Jak wnieść wkład w Open Source?Jak wnieść wkład w Open Source?
Jak wnieść wkład w Open Source?
 
Najczęstsze błędy początkujących programistów PHP
Najczęstsze błędy początkujących programistów PHPNajczęstsze błędy początkujących programistów PHP
Najczęstsze błędy początkujących programistów PHP
 
Praktyczny kurs Java
Praktyczny kurs JavaPraktyczny kurs Java
Praktyczny kurs Java
 
Od frontu po backend. Dwa oblicza SOLIDnego kodu
Od frontu po backend. Dwa oblicza SOLIDnego koduOd frontu po backend. Dwa oblicza SOLIDnego kodu
Od frontu po backend. Dwa oblicza SOLIDnego kodu
 

PHP meetup#4 Godek

  • 1. Wprowadzenie Przykłady Podsumowanie Programowanie funkcyjne w PHP Maciek Godek { fido : labs } godek.maciek@gmail.com PHP3City Meetup#4, 06.12.2013 Maciek Godek Programowanie funkcyjne w PHP
  • 2. Wprowadzenie Przykłady Podsumowanie Czym jest programowanie funkcyjne? Dlaczego zainteresowa´ sie FP? c ˛ Czym jest programowanie funkcyjne? Programowanie funkcyjne (FP) polega na: • unikaniu skutków ubocznych, • stosowaniu funkcji wy˙ szego rz˛ z edu. Maciek Godek Programowanie funkcyjne w PHP
  • 3. Wprowadzenie Przykłady Podsumowanie Czym jest programowanie funkcyjne? Dlaczego zainteresowa´ sie FP? c ˛ Czym jest programowanie funkcyjne? Programowanie funkcyjne (FP) polega na: • unikaniu skutków ubocznych, • stosowaniu funkcji wy˙ szego rz˛ z edu. Maciek Godek Programowanie funkcyjne w PHP
  • 4. Wprowadzenie Przykłady Podsumowanie Czym jest programowanie funkcyjne? Dlaczego zainteresowa´ sie FP? c ˛ Czym jest programowanie funkcyjne? Programowanie funkcyjne (FP) polega na: • unikaniu skutków ubocznych, • stosowaniu funkcji wy˙ szego rz˛ z edu. Maciek Godek Programowanie funkcyjne w PHP
  • 5. Wprowadzenie Przykłady Podsumowanie Czym jest programowanie funkcyjne? Dlaczego zainteresowa´ sie FP? c ˛ Sformułowanie problemu Jaki problem chcemy rozwiazac? ˛ ´ - Uczyni´ programowanie jak maksymalnie efektywnym, czyli: c • musie´ jak najmniej pamieta´ , oraz c ˛ c • móc jak najwiecej wnioskowa´ . ˛ c Maciek Godek Programowanie funkcyjne w PHP
  • 6. Wprowadzenie Przykłady Podsumowanie Czym jest programowanie funkcyjne? Dlaczego zainteresowa´ sie FP? c ˛ Sformułowanie problemu Jaki problem chcemy rozwiazac? ˛ ´ - Uczyni´ programowanie jak maksymalnie efektywnym, czyli: c • musie´ jak najmniej pamieta´ , oraz c ˛ c • móc jak najwiecej wnioskowa´ . ˛ c Maciek Godek Programowanie funkcyjne w PHP
  • 7. Wprowadzenie Przykłady Podsumowanie Czym jest programowanie funkcyjne? Dlaczego zainteresowa´ sie FP? c ˛ Sformułowanie problemu Jaki problem chcemy rozwiazac? ˛ ´ - Uczyni´ programowanie jak maksymalnie efektywnym, czyli: c • musie´ jak najmniej pamieta´ , oraz c ˛ c • móc jak najwiecej wnioskowa´ . ˛ c Maciek Godek Programowanie funkcyjne w PHP
  • 8. Wprowadzenie Przykłady Podsumowanie Czym jest programowanie funkcyjne? Dlaczego zainteresowa´ sie FP? c ˛ Sformułowanie problemu Jaki problem chcemy rozwiazac? ˛ ´ - Uczyni´ programowanie jak maksymalnie efektywnym, czyli: c • musie´ jak najmniej pamieta´ , oraz c ˛ c • móc jak najwiecej wnioskowa´ . ˛ c Maciek Godek Programowanie funkcyjne w PHP
  • 9. Wprowadzenie Przykłady Podsumowanie Czym jest programowanie funkcyjne? Dlaczego zainteresowa´ sie FP? c ˛ Sformułowanie problemu ´ Innymi słowy: uczynic program jak najbardziej czytelnym Maciek Godek Programowanie funkcyjne w PHP
  • 10. Wprowadzenie Przykłady Podsumowanie Czym jest programowanie funkcyjne? Dlaczego zainteresowa´ sie FP? c ˛ Sformułowanie problemu ´ Innymi słowy: uczynic program jak najbardziej czytelnym Maciek Godek Programowanie funkcyjne w PHP
  • 11. Wprowadzenie Przykłady Podsumowanie Czym jest programowanie funkcyjne? Dlaczego zainteresowa´ sie FP? c ˛ Sposoby na usprawnienie pracy z kodem Pomysły: • korzystanie z Integrated Development Environment • u˙ ywanie statycznej kontroli typów z • stosowanie konwencji w nazewnictwie obiektów • ogólniej: przestrzeganie konwencji w sposobie u˙ ycja z jezyka ˛ Maciek Godek Programowanie funkcyjne w PHP
  • 12. Wprowadzenie Przykłady Podsumowanie Czym jest programowanie funkcyjne? Dlaczego zainteresowa´ sie FP? c ˛ Sposoby na usprawnienie pracy z kodem Pomysły: • korzystanie z Integrated Development Environment • u˙ ywanie statycznej kontroli typów z • stosowanie konwencji w nazewnictwie obiektów • ogólniej: przestrzeganie konwencji w sposobie u˙ ycja z jezyka ˛ Maciek Godek Programowanie funkcyjne w PHP
  • 13. Wprowadzenie Przykłady Podsumowanie Czym jest programowanie funkcyjne? Dlaczego zainteresowa´ sie FP? c ˛ Sposoby na usprawnienie pracy z kodem Pomysły: • korzystanie z Integrated Development Environment • u˙ ywanie statycznej kontroli typów z • stosowanie konwencji w nazewnictwie obiektów • ogólniej: przestrzeganie konwencji w sposobie u˙ ycja z jezyka ˛ Maciek Godek Programowanie funkcyjne w PHP
  • 14. Wprowadzenie Przykłady Podsumowanie Czym jest programowanie funkcyjne? Dlaczego zainteresowa´ sie FP? c ˛ Sposoby na usprawnienie pracy z kodem Pomysły: • korzystanie z Integrated Development Environment • u˙ ywanie statycznej kontroli typów z • stosowanie konwencji w nazewnictwie obiektów • ogólniej: przestrzeganie konwencji w sposobie u˙ ycja z jezyka ˛ Maciek Godek Programowanie funkcyjne w PHP
  • 15. Wprowadzenie Przykłady Podsumowanie Czym jest programowanie funkcyjne? Dlaczego zainteresowa´ sie FP? c ˛ Sposoby na usprawnienie pracy z kodem Pomysły: • korzystanie z Integrated Development Environment • u˙ ywanie statycznej kontroli typów z • stosowanie konwencji w nazewnictwie obiektów • ogólniej: przestrzeganie konwencji w sposobie u˙ ycja z jezyka ˛ Maciek Godek Programowanie funkcyjne w PHP
  • 16. Wprowadzenie Przykłady Podsumowanie Czym jest programowanie funkcyjne? Dlaczego zainteresowa´ sie FP? c ˛ Konwencje w sposobie u˙ ycia jezyka z ˛ Kilka popularnych konwencji: • notacja wegierska ˛ • metodologia OOP (hermetyzacja, enkapsulacja, polimorfizm, dziedziczenie, ...) • programowanie funkcyjne Maciek Godek Programowanie funkcyjne w PHP
  • 17. Wprowadzenie Przykłady Podsumowanie Czym jest programowanie funkcyjne? Dlaczego zainteresowa´ sie FP? c ˛ Konwencje w sposobie u˙ ycia jezyka z ˛ Kilka popularnych konwencji: • notacja wegierska ˛ • metodologia OOP (hermetyzacja, enkapsulacja, polimorfizm, dziedziczenie, ...) • programowanie funkcyjne Maciek Godek Programowanie funkcyjne w PHP
  • 18. Wprowadzenie Przykłady Podsumowanie Czym jest programowanie funkcyjne? Dlaczego zainteresowa´ sie FP? c ˛ Konwencje w sposobie u˙ ycia jezyka z ˛ Kilka popularnych konwencji: • notacja wegierska ˛ • metodologia OOP (hermetyzacja, enkapsulacja, polimorfizm, dziedziczenie, ...) • programowanie funkcyjne Maciek Godek Programowanie funkcyjne w PHP
  • 19. Wprowadzenie Przykłady Podsumowanie Czym jest programowanie funkcyjne? Dlaczego zainteresowa´ sie FP? c ˛ Konwencje w sposobie u˙ ycia jezyka z ˛ Kilka popularnych konwencji: • notacja wegierska ˛ • metodologia OOP (hermetyzacja, enkapsulacja, polimorfizm, dziedziczenie, ...) • programowanie funkcyjne Maciek Godek Programowanie funkcyjne w PHP
  • 20. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ Zagadka: co robi poni˙ szy kod? z 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
  • 21. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ Zagadka: co robi poni˙ szy kod? z 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
  • 22. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Ł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 wszystkie ˛ słowa przecinkami, za wyjatkiem dwóch ostatnich, które ˛ sklejamy spójnikiem ’i’. Maciek Godek Programowanie funkcyjne w PHP
  • 23. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ Przykład u˙ ycia z 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
  • 24. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Ł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
  • 25. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ W strone PHP ˛ function złaczone($słowa) { // marze´ ˛ n match($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
  • 26. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Ł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
  • 27. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ Kolejna zagadka! Jak posortowa´ tablice stringów c ˛ w PHP według ich długo´ ci? s Maciek Godek Programowanie funkcyjne w PHP
  • 28. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ Kolejna zagadka! Jak posortowa´ tablice stringów c ˛ s w PHP według ich długo´ ci? Maciek Godek Programowanie funkcyjne w PHP
  • 29. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ Pierwsza próba: usort($tablica, function($a, $b) { return length($a) - length($b); }); Pytanie: czy powy˙ sze wywołanie posortuje tablice z ˛ rosnaco, czy malejaco? ˛ ˛ Maciek Godek Programowanie funkcyjne w PHP
  • 30. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ Pierwsza próba: usort($tablica, function($a, $b) { return length($a) - length($b); }); Pytanie: czy powy˙ sze wywołanie posortuje tablice z ˛ rosnaco, czy malejaco? ˛ ˛ Maciek Godek Programowanie funkcyjne w PHP
  • 31. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Ł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
  • 32. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Ł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
  • 33. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ Sortowanie malejaco ˛ function descending ($prop) { return function($a, $b) use($prop) { return -call_user_func(ascending($prop), $a, $b); }; } je˙ eli is_callable($f), z to zapis call_user_func($f, $argumenty ...) jest równowa˙ ny zapisowi $f($argumenty ...) z Maciek Godek Programowanie funkcyjne w PHP
  • 34. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ Sortowanie malejaco ˛ function descending ($prop) { return function($a, $b) use($prop) { return -call_user_func(ascending($prop), $a, $b); }; } je˙ eli is_callable($f), z to zapis call_user_func($f, $argumenty ...) jest równowa˙ ny zapisowi $f($argumenty ...) z Maciek Godek Programowanie funkcyjne w PHP
  • 35. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ Popularne funkcje wy˙ szego rz˛ z edu • 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
  • 36. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ Popularne funkcje wy˙ szego rz˛ z edu • 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
  • 37. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ Popularne funkcje wy˙ szego rz˛ z edu • 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
  • 38. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ Popularne funkcje wy˙ szego rz˛ z edu • 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
  • 39. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ call_user_func_array – synonimy 1 Zastosowanie call_user_func_array – tworzenie synonimów: function apply() { return call_user_func_array( ’call_user_func_array’, func_get_args() ); } Maciek Godek Programowanie funkcyjne w PHP
  • 40. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ call_user_func_array – synonimy 1 Zastosowanie call_user_func_array – tworzenie synonimów: function apply() { return call_user_func_array( ’call_user_func_array’, func_get_args() ); } Maciek Godek Programowanie funkcyjne w PHP
  • 41. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ call_user_func_array – synonimy 2 Zastosowanie call_user_func_array – tworzenie synonimó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
  • 42. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ call_user_func_array – synonimy 2 Zastosowanie call_user_func_array – tworzenie synonimó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
  • 43. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ call_user_func_array – synonimy 2 Zastosowanie call_user_func_array – tworzenie synonimó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
  • 44. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ call_user_func_array – synonimy 2 Zastosowanie call_user_func_array – tworzenie synonimó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
  • 45. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ call_user_func_array – synonimy 3 Zastosowanie call_user_func_array do tworzenia synonimów – problemy: • brak argumentów formalnych – utrudnia współprace z IDE ˛ • brak obsługi referencji function pop() { return apply(’array_pop’, func_get_args()); } // ´le!!! z • generuje narzuty wywołan (kod działa wolniej) ´ • a co z obsługa argumentów domy´ lnych? ˛ s Maciek Godek Programowanie funkcyjne w PHP
  • 46. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ call_user_func_array – synonimy 3 Zastosowanie call_user_func_array do tworzenia synonimów – problemy: • brak argumentów formalnych – utrudnia współprace z IDE ˛ • brak obsługi referencji function pop() { return apply(’array_pop’, func_get_args()); } // ´le!!! z • generuje narzuty wywołan (kod działa wolniej) ´ • a co z obsługa argumentów domy´ lnych? ˛ s Maciek Godek Programowanie funkcyjne w PHP
  • 47. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ call_user_func_array – synonimy 3 Zastosowanie call_user_func_array do tworzenia synonimów – problemy: • brak argumentów formalnych – utrudnia współprace z IDE ˛ • brak obsługi referencji function pop() { return apply(’array_pop’, func_get_args()); } // ´le!!! z • generuje narzuty wywołan (kod działa wolniej) ´ • a co z obsługa argumentów domy´ lnych? ˛ s Maciek Godek Programowanie funkcyjne w PHP
  • 48. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ call_user_func_array – synonimy 3 Zastosowanie call_user_func_array do tworzenia synonimów – problemy: • brak argumentów formalnych – utrudnia współprace z IDE ˛ • brak obsługi referencji function pop() { return apply(’array_pop’, func_get_args()); } // ´le!!! z • generuje narzuty wywołan (kod działa wolniej) ´ • a co z obsługa argumentów domy´ lnych? ˛ s Maciek Godek Programowanie funkcyjne w PHP
  • 49. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ call_user_func_array – synonimy 3 Zastosowanie call_user_func_array do tworzenia synonimów – problemy: • brak argumentów formalnych – utrudnia współprace z IDE ˛ • brak obsługi referencji function pop() { return apply(’array_pop’, func_get_args()); } // ´le!!! z • generuje narzuty wywołan (kod działa wolniej) ´ • a co z obsługa argumentów domy´ lnych? ˛ s Maciek Godek Programowanie funkcyjne w PHP
  • 50. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ call_user_func_array – synonimy 3 Zastosowanie call_user_func_array do tworzenia synonimów – problemy: • brak argumentów formalnych – utrudnia współprace z IDE ˛ • brak obsługi referencji function pop() { return apply(’array_pop’, func_get_args()); } // ´le!!! z • generuje narzuty wywołan (kod działa wolniej) ´ • a co z obsługa argumentów domy´ lnych? ˛ s Maciek Godek Programowanie funkcyjne w PHP
  • 51. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ call_user_func_array – synonimy 4 ´ Zagadka: jak stworzyc synonim dla func_get_args? Maciek Godek Programowanie funkcyjne w PHP
  • 52. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ array_map – przykład map: odwzorowanie zbioru funkcja. Na przykład, chcac usuna´ ˛ ˛ ˛c białe znaki ze stringów bedacych elementami tablicy przy ˛ ˛ pomocy funkcji trim, mo˙ emy napisa´ : z c $ogolone_napisy = map(’trim’, $napisy) Maciek Godek Programowanie funkcyjne w PHP
  • 53. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ array_map – przykład ˛ ˛c map: odwzorowanie zbioru funkcja. Na przykład, chcac usuna´ ˛ białe znaki ze stringów bedacych elementami tablicy przy ˛ ˛ pomocy funkcji trim, mo˙ emy napisa´ : z c $ogolone_napisy = map(’trim’, $napisy) Maciek Godek Programowanie funkcyjne w PHP
  • 54. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ array_map – zagadka ´ ´´ Zagadka: Chcemy wiedziec, jaka jest najwieksza długosc ˛ stringu w danej tablicy (stringów). Maciek Godek Programowanie funkcyjne w PHP
  • 55. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ array_map – rozwiazanie ˛ Rozwiazanie: max(map(’length’, $tablica)) ˛ Uwaga! To jest po prostu zdanie „najwieksza spo´ ród długo´ ci ˛ s s elementów w $tablicy” wyra˙ one w PHP! z Maciek Godek Programowanie funkcyjne w PHP
  • 56. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ array_map – rozwiazanie ˛ Rozwiazanie: max(map(’length’, $tablica)) ˛ Uwaga! To jest po prostu zdanie „najwieksza spo´ ród długo´ ci ˛ s s elementów w $tablicy” wyra˙ one w PHP! z Maciek Godek Programowanie funkcyjne w PHP
  • 57. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ array_map – ciekawostka Ciekawostka: map(’f’, map(’g’, $a)) = map(’f’ ◦ ’g’, $a), gdzie symbol ◦ oznacza zło˙ enie funkcji, tj. f (g(x)) z Zadanie: napisz funkcje ’compose’, która pobiera jako ˛ argumenty funkcje jednoargumentowe i zwraca funkcje bedaca ˛ ˛ ˛ ˛ ich zło˙ eniem z Maciek Godek Programowanie funkcyjne w PHP
  • 58. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ array_map – ciekawostka Ciekawostka: map(’f’, map(’g’, $a)) = map(’f’ ◦ ’g’, $a), gdzie symbol ◦ oznacza zło˙ enie funkcji, tj. f (g(x)) z Zadanie: napisz funkcje ’compose’, która pobiera jako ˛ argumenty funkcje jednoargumentowe i zwraca funkcje bedaca ˛ ˛ ˛ ˛ ich zło˙ eniem z Maciek Godek Programowanie funkcyjne w PHP
  • 59. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ array_filter – przykład filter: odsiewanie elementów spełniajacych dane kryterium, ˛ np. chcemy znale´ c wszystkie liczby z danej tablicy, z´ 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
  • 60. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ array_filter – przykład filter: odsiewanie elementów spełniajacych dane kryterium, ˛ np. chcemy znale´ c wszystkie liczby z danej tablicy, z´ 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
  • 61. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ array_filter – przykład filter: odsiewanie elementów spełniajacych dane kryterium, ˛ np. chcemy znale´ c wszystkie liczby z danej tablicy, z´ 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
  • 62. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ array_reduce – wzmianka reduce: funkcyjna bestia ´ zastosowanie: uogólnianie dwuargumentowych działan łacznych na dowolna ilo´ c argumentów ˛ ˛ s´ Maciek Godek Programowanie funkcyjne w PHP
  • 63. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ array_reduce – wzmianka reduce: funkcyjna bestia ´ zastosowanie: uogólnianie dwuargumentowych działan łacznych na dowolna ilo´ c argumentów ˛ ˛ s´ Maciek Godek Programowanie funkcyjne w PHP
  • 64. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ Składnia $_ Problem: mamy tablice obiektów. Chcieliby´ my mie´ tablice ˛ s c ˛ rzutów tych obiektów na ich pewne własno´ ci, które mo˙ emy s z otrzyma´ przez wywołanie odpowiedniej metody. c Klasyczne rozwiazanie: ˛ $rzuty = []; foreach($obiekty as $obiekt) { $rzuty[] = $obiekt->pobierzWłasno´´(); sc } Funkcyjne rozwiazanie: ˛ global $_; // drobne oszustwo $rzuty = map($_->pobierzWłasno´´(), $obiekty); sc Maciek Godek Programowanie funkcyjne w PHP
  • 65. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ Składnia $_ Problem: mamy tablice obiektów. Chcieliby´ my mie´ tablice ˛ s c ˛ rzutów tych obiektów na ich pewne własno´ ci, które mo˙ emy s z otrzyma´ przez wywołanie odpowiedniej metody. c Klasyczne rozwiazanie: ˛ $rzuty = []; foreach($obiekty as $obiekt) { $rzuty[] = $obiekt->pobierzWłasno´´(); sc } Funkcyjne rozwiazanie: ˛ global $_; // drobne oszustwo $rzuty = map($_->pobierzWłasno´´(), $obiekty); sc Maciek Godek Programowanie funkcyjne w PHP
  • 66. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ Składnia $_ Problem: mamy tablice obiektów. Chcieliby´ my mie´ tablice ˛ s c ˛ rzutów tych obiektów na ich pewne własno´ ci, które mo˙ emy s z otrzyma´ przez wywołanie odpowiedniej metody. c Klasyczne rozwiazanie: ˛ $rzuty = []; foreach($obiekty as $obiekt) { $rzuty[] = $obiekt->pobierzWłasno´´(); sc } Funkcyjne rozwiazanie: ˛ global $_; // drobne oszustwo $rzuty = map($_->pobierzWłasno´´(), $obiekty); sc Maciek Godek Programowanie funkcyjne w PHP
  • 67. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ Składnia $_ Problem: mamy tablice obiektów. Chcieliby´ my mie´ tablice ˛ s c ˛ rzutów tych obiektów na ich pewne własno´ ci, które mo˙ emy s z otrzyma´ przez wywołanie odpowiedniej metody. c Klasyczne rozwiazanie: ˛ $rzuty = []; foreach($obiekty as $obiekt) { $rzuty[] = $obiekt->pobierzWłasno´´(); sc } Funkcyjne rozwiazanie: ˛ global $_; // drobne oszustwo $rzuty = map($_->pobierzWłasno´´(), $obiekty); sc Maciek Godek Programowanie funkcyjne w PHP
  • 68. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ Składnia $_ Inny problem: sortowanie tablicy tablic wzgledem danej ˛ kolumny: usort($array, ascending($_[’column’])); Maciek Godek Programowanie funkcyjne w PHP
  • 69. Wprowadzenie Przykłady Podsumowanie Spójniki Sortowanie tablicy Inne funkcje wy˙ szego rz˛ z edu Łaczenie OOP i FP ˛ Składnia $_ Inny problem: sortowanie tablicy tablic wzgledem danej ˛ kolumny: usort($array, ascending($_[’column’])); Maciek Godek Programowanie funkcyjne w PHP
  • 70. Wprowadzenie Przykłady Podsumowanie Podsumowanie Zalety FP: • łatwiejsza analiza kodu • dobra kompozycjonalno´ c (nie trzeba sie przejmowa´ s´ ˛ c kopiowaniem i referencjami) • bardzo naturalne testowanie • uproszczona paralelizacja Wady FP: • nie wsz˛ edzie daje sie stosowa´ ˛ c • brak wsparcia ze strony narz˛ edzi • kod mo˙ e działa´ niewydajnie z c Maciek Godek Programowanie funkcyjne w PHP
  • 71. Wprowadzenie Przykłady Podsumowanie Podsumowanie Zalety FP: • łatwiejsza analiza kodu • dobra kompozycjonalno´ c (nie trzeba sie przejmowa´ s´ ˛ c kopiowaniem i referencjami) • bardzo naturalne testowanie • uproszczona paralelizacja Wady FP: • nie wsz˛ edzie daje sie stosowa´ ˛ c • brak wsparcia ze strony narz˛ edzi • kod mo˙ e działa´ niewydajnie z c Maciek Godek Programowanie funkcyjne w PHP
  • 72. Wprowadzenie Przykłady Podsumowanie Podsumowanie Zalety FP: • łatwiejsza analiza kodu • dobra kompozycjonalno´ c (nie trzeba sie przejmowa´ s´ ˛ c kopiowaniem i referencjami) • bardzo naturalne testowanie • uproszczona paralelizacja Wady FP: • nie wsz˛ edzie daje sie stosowa´ ˛ c • brak wsparcia ze strony narz˛ edzi • kod mo˙ e działa´ niewydajnie z c Maciek Godek Programowanie funkcyjne w PHP
  • 73. Wprowadzenie Przykłady Podsumowanie Podsumowanie Zalety FP: • łatwiejsza analiza kodu • dobra kompozycjonalno´ c (nie trzeba sie przejmowa´ s´ ˛ c kopiowaniem i referencjami) • bardzo naturalne testowanie • uproszczona paralelizacja Wady FP: • nie wsz˛ edzie daje sie stosowa´ ˛ c • brak wsparcia ze strony narz˛ edzi • kod mo˙ e działa´ niewydajnie z c Maciek Godek Programowanie funkcyjne w PHP
  • 74. Wprowadzenie Przykłady Podsumowanie Podsumowanie Zalety FP: • łatwiejsza analiza kodu • dobra kompozycjonalno´ c (nie trzeba sie przejmowa´ s´ ˛ c kopiowaniem i referencjami) • bardzo naturalne testowanie • uproszczona paralelizacja Wady FP: • nie wsz˛ edzie daje sie stosowa´ ˛ c • brak wsparcia ze strony narz˛ edzi • kod mo˙ e działa´ niewydajnie z c Maciek Godek Programowanie funkcyjne w PHP
  • 75. Wprowadzenie Przykłady Podsumowanie Podsumowanie Zalety FP: • łatwiejsza analiza kodu • dobra kompozycjonalno´ c (nie trzeba sie przejmowa´ s´ ˛ c kopiowaniem i referencjami) • bardzo naturalne testowanie • uproszczona paralelizacja Wady FP: • nie wsz˛ edzie daje sie stosowa´ ˛ c • brak wsparcia ze strony narz˛ edzi • kod mo˙ e działa´ niewydajnie z c Maciek Godek Programowanie funkcyjne w PHP
  • 76. Wprowadzenie Przykłady Podsumowanie Podsumowanie Zalety FP: • łatwiejsza analiza kodu • dobra kompozycjonalno´ c (nie trzeba sie przejmowa´ s´ ˛ c kopiowaniem i referencjami) • bardzo naturalne testowanie • uproszczona paralelizacja Wady FP: • nie wsz˛ edzie daje sie stosowa´ ˛ c • brak wsparcia ze strony narz˛ edzi • kod mo˙ e działa´ niewydajnie z c Maciek Godek Programowanie funkcyjne w PHP
  • 77. Wprowadzenie Przykłady Podsumowanie Podsumowanie Zalety FP: • łatwiejsza analiza kodu • dobra kompozycjonalno´ c (nie trzeba sie przejmowa´ s´ ˛ c kopiowaniem i referencjami) • bardzo naturalne testowanie • uproszczona paralelizacja Wady FP: • nie wsz˛ edzie daje sie stosowa´ ˛ c • brak wsparcia ze strony narz˛ edzi • kod mo˙ e działa´ niewydajnie z c Maciek Godek Programowanie funkcyjne w PHP
  • 78. Wprowadzenie Przykłady Podsumowanie Podsumowanie Zalety FP: • łatwiejsza analiza kodu • dobra kompozycjonalno´ c (nie trzeba sie przejmowa´ s´ ˛ c kopiowaniem i referencjami) • bardzo naturalne testowanie • uproszczona paralelizacja Wady FP: • nie wsz˛ edzie daje sie stosowa´ ˛ c • brak wsparcia ze strony narz˛ edzi • kod mo˙ e działa´ niewydajnie z c Maciek Godek Programowanie funkcyjne w PHP
  • 79. Wprowadzenie Przykłady Podsumowanie Podsumowanie Zalety FP: • łatwiejsza analiza kodu • dobra kompozycjonalno´ c (nie trzeba sie przejmowa´ s´ ˛ c kopiowaniem i referencjami) • bardzo naturalne testowanie • uproszczona paralelizacja Wady FP: • nie wsz˛ edzie daje sie stosowa´ ˛ c • brak wsparcia ze strony narz˛ edzi • kod mo˙ e działa´ niewydajnie z c Maciek Godek Programowanie funkcyjne w PHP
  • 80. Wprowadzenie Przykłady Podsumowanie Lektury Wpiszcie sobie w Google: John Carmack Functional Programming Ksia˙ ki: ˛z „Struktura i Interpretacja Programów Komputerowych”, H. Abelson, G. Sussman Maciek Godek Programowanie funkcyjne w PHP
  • 81. Wprowadzenie Przykłady Podsumowanie Lektury Wpiszcie sobie w Google: John Carmack Functional Programming Ksia˙ ki: ˛z „Struktura i Interpretacja Programów Komputerowych”, H. Abelson, G. Sussman Maciek Godek Programowanie funkcyjne w PHP