Hi,

currently when using array destructuring the variables are assigned as
they are. For example we split a string with explode all variables will
contain strings:

$data = "foo:*:1023:1000::/home/foo:/bin/sh";
[$user, $pass, $uid, $gid, $gecos, $home, $shell] = explode(":", $data);

If we want to write functions consuming $uid and $gid as integer values
with strict types enabled we need to cast the values afterwards:

$uid = (int) $uid;
$gid = (int) $gid;
// or during the function call
$myConsumingObject->myConsumingFunction((int) $uid, (int) $gid);

I think you get my point. How about adding some syntactic sugar and
allow type casting inside the detructuring expression?

$data = "foo:*:1023:1000::/home/foo:/bin/sh";
[$user, $pass, (int) $uid, (int) $gid, $gecos, $home, $shell] =
explode(":", $data);
// $uid and $gid are integer values now. All other variables remain as
they are and contain strings

An example with associative arrays in loops:

$array = [
    [
        'name' => 'a',
        'id' => '1'
    ],
    [
        'name' => 'b',
        'id' => '2'
    ],
];

foreach ($array as ['id' => (int) $id, 'name' => $name]) {
    // $id contains integer values
}

Further thoughts: when using the list() reference assignment implemented
in PHP7.3 the referenced value could be casted (something to discuss
about, maybe as future scope as casting a reference assignment currently
isn't supported):

$array = [1, 2];
[(string) $a, (string) &$b] = $array;
// $a would be a string: '1'
// $b would be a string: '2'
// $array would contain one integer and one string element: [1, '2']

Thoughts?

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

Reply via email to