On Sun, Apr 25, 2021 at 9:26 PM Larry Garfield <larry@garfieldtech.com>
wrote:
> Greetings, Internalians!
>
> I would like to offer for your consideration another RFC, specifically
> syntax for partial function application.
>
> https://wiki.php.net/rfc/partial_function_application
>
> It includes an implementation by Joe Watkins that is already about 95%
> complete. (There's some edge cases he's still sorting out, but all of the
> typical cases should work already.) Most of the design work comes from
> Levi Morrison and Paul Crovella. I helped out with the tests, a few edge
> bits, and general instigator/nudge. :-)
>
> Discuss.
>
> --
> Larry Garfield
> larry@garfieldtech.com
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: https://www.php.net/unsub.php
>
>
Heya, this is an interesting feature!
The way I understand it, it adds the ability to turn a call to an object
method into a callable?
```php
class CategorizedThings {
private array $theThings = [];
public function addOneThing(mixed $thing, string $category): void {
$this->theThings[$category] = $thing;
}
}
$things = new CategorizedThings();
$adder = $things->addOneThing(?, 'a category');
foreach ($repository->findAll() as $aThing) {
$adder($aThing);
}
// which would be the same as:
$things = new CategorizedThings();
$adder = function (mixed $aThing) use ($things) {
$things->addOneThing($aThing, 'a category');
}
foreach ($repository->findAll() as $aThing) {
$adder($aThing);
}
```
I assume the following would also be possible?
```php
class Something {
public static function toString(mixed $v): string {
return (string) $v;
}
}
function toString(mixed $v) : string {
return (string) $v;
}
array_map(Something::toString(?), [1, 2, 3]);
array_map(toString(?), [1, 2, 3]);
// instead of
array_map([Something::class, 'toString'], [1, 2, 3])
array_map('toString', [1, 2, 3]);
```
If this is indeed the scenario, would it be worth adding a syntax to
indicate _all_ parameters can be placeholders? When a signature has
multiple arguments, toString(?, ?, ?, ?) could become toString(...?) or
maybe something like toString(*)?