I checked in my vendor directory for currently used switch(true) usages,
there were 96 matches. It is often used when handling an unknown value
and needing to display or convert it, as there the structure of a switch
is easier to scan compared to other comparisons like ifs (at least it is
for me). Compared to match these switch statements are a lot uglier,
which shows that there are use cases for it even when you are forced to
use switch.

This is a good example in my estimation, from the Symfony Console Dumper
class (taken from Symfony 5.2), when a value is converted into a string
representation:

```php
$this->handler = function ($var): string {
    switch (true) {
        case null === $var:
            return 'null';
        case true === $var:
            return 'true';
        case false === $var:
            return 'false';
        case \is_string($var):
            return '"'.$var.'"';
        default:
            return rtrim(print_r($var, true));
    }
};
```

With match this becomes much more concise:

```php
$this->handler = function ($var): string {
    return match {
        null === $var => 'null',
        true === $var => 'true',
        false === $var => 'false',
        \is_string($var) => '"'.$var.'"',
        default => rtrim(print_r($var, true)),
    };
};
```

The same with ifs:

```php
$this->handler = function ($var): string {
    if (null === $var) {
        return 'null';
    }
    if (true === $var) {
        return 'true';
    }
    if (false === $var) {
        return 'false';
    }
    if (\is_string($var)) {
        return '"'.$var.'"';
    }

    return rtrim(print_r($var, true));
};
```

The implied return type for match and the reduced amount of code to scan
makes match {} much better in my opinion, with ifs you always have to
make sure there isn't additional logic somewhere, and it makes it easy
to add more complex code "by accident" compared to match. match (true)
would be possible now, but the true makes the code a bit confusing,
while without the (true) it reads more like natural language ("match the
first possible expression in this list and return a corresponding value").

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php

Reply via email to