Hello,

I would like to gather interest in adding Uniform Function Call Syntax (UFCS) 
to the PHP language. In short, it allows to call any static function `f($a)` as 
`$a->f(...)`. The `...` is required because not all functions have the desired 
parameter in the first position. Outlined below are some benefits of this 
syntax.

It allows for chaining of function calls that otherwise would look ugly. A 
common pattern is filtering and mapping arrays:
```php
$arr = [1, 2, -3, 4, 0, 5];
$filtered = \array_filter($arr, fn ($x) => $x > 0);
$result = \array_map(fn ($x) => $x * 2, $filtered);
\var_dump($result);
```
This can be written more eloquently:
```php
[1, 2, -3, 4, 0, 5]
        ->\array_filter(..., fn ($x) => $x > 0)
        ->\array_map(fn ($x) => $x * 2, ...)
        ->\var_dump(...);
```

Another use case is for extension functions:
```php
class Cat
{
        public function __construct(public string $name) {}
       
        public function meow(): self
        {
                echo "{$this->name} meowed\n";
                return $this;
        }
       
        public function lickPaw(): self
        {
                echo "{$this->name} licked paw\n";
                return $this;
        }
}

class CatExtension
{
        public static function scratch(Cat $cat): Cat
        {
                echo "{$cat->name} scratched\n";
                return $cat;
        }
}

$cat = (new Cat('Tabby'))
        ->meow()
        ->(CatExtension::scratch)(...)
        ->lickPaw();
```

For my proposal, only static functions need to be supported, but I don't see 
why non-static functions can't be supported. One thing I'm unsure of is what 
happens if an imported static function has the same name as a member function.

The Wikipedia page has a bit more details, as well as examples of languages 
which implement this syntax: 
https://en.wikipedia.org/wiki/Uniform_Function_Call_Syntax.

Please let me know your questions, opinions, and feedback.

Regards,

Yakov

Reply via email to