5 ms·
I like it. I really believe the thing PHP needs the most is a rework of string / array functions to make them more consistent and chain able. Now they are at l
by gbalduzzi 1y ago
I like it.
I really believe the thing PHP needs the most is a rework of string / array functions to make them more consistent and chain able. Now they are at least chainable.
I'm not a fan of the ... syntax though, especially when mixed in the same chain with the spread operator
- noduerme 1y agoAgree, the ... syntax feels confusing when each fn($x) in the example uses $x as the name of its argument. My initial instinct would be to write like this: `$result = $arr |> fn($arr) => array_column($arr, 'tags') // Gets an array of arrays |> fn($cols) => array_merge(...$cols)` Which makes me wonder how this handles scope. I'd imagine the interior of some chained function can't reference the input $arr, right? Does it allow pass by reference?
- Einenlum 1y agoYou can write it this way. The parameter name is arbitrary. And no, to my knowledge you can't access the var from the previous scope
- cess11 1y agoYou can do function ($parameter) use ($data) { ... } to capture stuff from the local environment. Edit: And you can pass by reference: > $stuff = [1] = [ 1, ] > $fn = function ($par) use (&$stuff) { $stuff[] = $par; } = Closure($par) {#3980 …2} > $fn(2) = null > $stuff = [ 1, 2, ] Never done it in practice, though, not sure if there are any footguns besides the obvious hazards in remote mutation.
- noduerme 1y agoidk if it counts as an obvious hazard, but being able to modify the original input by reference within a chain of piped functions definitely makes it a lot harder to reason about what that sequence might be doing. Particularly since we assume that arrays are passed by reference anyway unless the function you're calling is making a shallow copy of their elements. My feeling is that this makes the code less legible. I'd rather write 5 lines of code that mutate an object or return a copy than do a pipe this way. I'm sort of not excited to start running into examples of this in the wild.
- colecut 1y agoPHP string / array functions are consistent. string functions use (haystack, needle) and array functions use (needle, haystack) because that's the way the underlying C libraries also worked
- Einenlum 1y agoThey're not though. array_filter takes (arr, callback) https://www.php.net/manual/en/function.array-filter.php https://www.php.net/manual/en/function.array-filter.php array_map takes (callback, arr) https://www.php.net/manual/en/function.array-map.php https://www.php.net/manual/en/function.array-map.php
- exasperaited 1y agoThis is "english-sentence-order-consistent", as it goes. Array filter is "filter this array with this function". Array map is "map this function over this array". But I agree any replacement function should be consistent with Haskell.
- eurleif 1y agoOne can construct English sentences in the opposite order. There is no singular "English sentence order". "Filter for this function in this array" "Map over this array with this function"
- exasperaited 1y agoRight, but these are both more unwieldy. One filters something with something else, in the real world. Filter water with a mesh etc. And (in maths, at least) one maps something onto something else. (And less commonly one maps an area onto paper etc.) Just because you can make your two sentences does not make them natural word order.
- hnlmorg 1y agoWhen you consider that PHP is used by hundreds of thousands of non-native English speakers, I don’t really think you can make a legitimate claim that “English sentence order” trumps “consistent argument ordering”. There’s enough viral videos online of how even neighbouring European counties order common sentences differently. Even little things like reading the time (half past the previous hour vs half to the next hour) and counting is written differently in different languages. So modelling the order of parameters based on English vernacular doesn’t make a whole lot of sense for programming languages used by programmers of all nationalities.
- account42 1y agoThe syntax could be improved by allowing you to omit the (...) part entirely for single argument functions and using currying for functions that need additional arguments. So you would end up with something like: $result = $arr |> select_column('tags') // Gets an array of arrays |> fn($x) => array_merge(...$x) // Flatten into one big array |> array_unique // Remove duplicates |> array_value // Reindex the array.