Re: Type casting while array destructuring
| From: | Rowan Tommins | Date: | Tue, 24 Mar 2020 14:46:58 +0000 |
| Subject: | Re: Type casting while array destructuring | ||
| References: | 1 2 3 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-109275@lists.php.net to get a copy of this message | ||
On Tue, 24 Mar 2020 at 14:28, Reindl Harald <h.reindl@thelounge.net> wrote:
>
> Am 24.03.20 um 15:23 schrieb Rowan Tommins:
> > On the other hand, this is exactly the kind of thing where
> strict_types=1 makes things worse - you'll actually get *better* error
> output if you use strict_types=0 and pass the string to a function marked
> as requiring int
> no!
>
> with strict_types=0 the casting simp,y happens by the caller and you get
> no error at all
>
Only if the string is a valid integer; compare https://3v4l.org/uvPYZ with
https://3v4l.org/h1aT5
function foo(int $x) { var_dump($x); }
declare(strict_types=1);
$a = 'hello';
$a = (int)$a; // cast doesn't produce any errors
foo($a); // dumps int(0)
declare(strict_types=0);
$a = 'hello';
foo($a); // TypeError: Argument 1 passed to foo() must be of the type int,
string given
That's what I mean about "stricter casting" - (int)$a basically always
succeeds, so it would be useful to have a version that rejects things like
non-integer strings. That could be Yet Another Runtime Mode using
declare(), but it could just be a different syntax, so that you'd write
this:
// regardless of which strict_types mode you're in
$a = 'hello';
$a = (int!)$a; // TypeError: string value is not valid for strict cast to
type int
foo($a); // statement never reached
Regards,
--
Rowan Tommins
[IMSoP]