Re: [RFC] [VOTE] Deprecations for PHP 8.4
| From: | Larry Garfield | Date: | Tue, 23 Jul 2024 16:26:59 +0000 |
| Subject: | Re: [RFC] [VOTE] Deprecations for PHP 8.4 | ||
| References: | 1 2 3 4 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-124562@lists.php.net to get a copy of this message | ||
On Tue, Jul 23, 2024, at 4:00 PM, Matthew Weier O'Phinney wrote:
>> However, a few people indicated a desire to have an explicit wildcard _ anyway, even if
>> it's redundant, as it's a more common and standard approach in other languages.
>> We've indicated that we are open to making that an optional secondary vote in the pattern
>> matching RFC if there's enough interest (it would be trivial), though I haven't bothered
>> to add it to the RFC text yet.
>>
>> Having _ available could also be used in other "wildcard" or "ignore
>> this" cases, like exploding into a list assignment or similar, though I don't believe that
>> has been fully explored.
>
> Can you provide examples of what that usage would look like? And the
> question I have really is, does this actually _require_ using "_", or
> could another token be used for such matches?
Hypothetical pattern matching example:
$foo is ['a' => int, 'b' => $b, 'c' => mixed];
That would assert that there's 3 keys. "a" may be any integer (but only an integer),
"b" can be anything and will be captured to a variable, and "c" must be defined
but we don't care what it is.
The suggestion is to basically alias _ to "mixed" for pattern purposes:
$foo is ['a' => int, 'b' => $b, 'c' => _];
As "there's a var here but I don't care what it is, ignore it" is a common
meaning of _ in other languages. But that would need to be disambiguated from a pattern saying
"c must be an instance of the class _". Technically any symbol/set of symbols could be
used there (as it's just an alias to mixed, which has the exact same effect), but _ is a common
choice in other languages.
In theory, that could be expanded in the future to something like (note: this hasn't been
seriously discussed that I know of, I'm just spitballing randomly):
[$a, $b, _] = explode(':', 'foo:bar:baz');
To assign $a = "foo", $b to "bar", and just ignore "baz". Which
might cause parser issues if _ is a legal class name, I'm not sure. There's probably
other "ignore this" cases we could come up with, but I haven't actually thought about
it.
Again, whether any of the above is a compelling argument or not I leave as an exercise for the
reader.
--Larry Garfield