Mam sobie bibliotekę, w której są takie funkcyjne metody jak map()
, filter()
, forEach()
, reduce()
, flatMap()
i takie podobne. Oczywiście ich parametrem jest callback/funkcja.
W niektórych językach programowania, callbacki do takich funkcji dostają index, np w JavaScript dostajemy index jako drugi parametr w map()
:
['hi'].map((value, index) => {
});
podobnie jest z filter()
, reduce()
, etc.
W JavaScript to działa, bo we wszystkich funkcjach nadmiarowe argumenty są ignorowane, tzn działają oba takie kody:
[].map(() => {});
[].map(value => {});
[].map((value, index) => {});
Czemu PHP był projektowany przez pijanych klaunów
Ale oczywiście, w PHP, jakże by inaczej, nie jest tak pięknie, bo tak jak parametry do funkcji anonimowych i metod są ignorowane, tak parametry do wbudowanych funkcji już nie są - widocznie jakiś kodzik w C jest pod spodem, który to waliduje.
Więc np w mojej bibliotece, taki kod by przeszedł:
$match = Pattern::of('\w+')->match("Welcome");
$match->map(function ($match, $index) { // $match oraz $index
});
tak już nie przejdzie całkowicie z wbudowanymi
$match = Pattern::of('\w+')->match("Welcome");
$match->map('strToUpper'); // <!--- tutaj błąd
Dostajemy
ArgumentCountError : strtolower() expects exactly 1 argument, 2 given
C:\Users\Riddle\PhpstormProjects\T-Regx\test\Feature\CleanRegex\Match\_countable\MatchPatternTest.php:34
Pytanie
Noi, co teraz począć. Chętnie dodałbym ten drugi argument $index
, żeby był przekazywany do tych funkcji
$match = Pattern::of('\w+')->match("Welcome");
$match->forEach(function ($match, $index) {});
$match->map(function ($match, $index) {});
$match->filter(function ($match, $index) {});
$match->flatMap(function ($match, $index) {});
$match->reduce(function ($match, $index) {});
i to będzie działało z callbackami, anonimowymi funkcjami i referencjami do metod, ale z wbudowanymi funkcjami nie - przynajmniej nie bezpośrednio.
Noi co zrobić?