Req #76412 [Opn->Nab]: Nullable type default value
| From: | daverandom@php.net | Date: | Tue, 05 Jun 2018 09:11:12 +0000 |
| Subject: | Req #76412 [Opn->Nab]: Nullable type default value | ||
| References: | 1 | Groups: | php.standards |
| Request: | Send a blank email to standards-+get-1334@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=76412&edit=1
ID: 76412
Updated by: daverandom@php.net
Reported by: ionuthrive at yahoo dot com
Summary: Nullable type default value
-Status: Open
+Status: Not a bug
Type: Feature/Change Request
Package: PHP Language Specification
Operating System: All
PHP Version: 7.2.6
Block user comment: N
Private report: N
New Comment:
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to
report
a bug at http://bugs.php.net/how-to-report.php
This is by design. Passing null does not always indicate "skip this parameter and use the
default", null may also have a semantic meaning.
The behaviour you want can be easily achieved in combination with the ?? operator, something like:
function get(string $id, ?int $limit = 1, ?string $type = 'standard', ?array $options =
[]){
var_dump($limit ?? 1);
var_dump($type ?? 'standard');
var_dump($options ?? []);
}
In combination with private class constants, you can also avoid specifying the default value more
than once in code, retaining correct information reported by reflection/IDEs etc:
class Foo
{
private const DEFAULT_LIMIT = 1;
private const DEFAULT_TYPE = 'standard';
private const DEFAULT_OPTS = [];
public function get(string $id, ?int $limit = self::DEFAULT_LIMIT, ?string $type =
self::DEFAULT_TYPE, ?array $options = self::DEFAULT_OPTS)
{
var_dump($limit ?? self::DEFAULT_LIMIT);
var_dump($type ?? self::DEFAULT_TYPE);
var_dump($options ?? self::DEFAULT_OPTS);
}
}
Previous Comments:
------------------------------------------------------------------------
[2018-06-05 08:55:55] ionuthrive at yahoo dot com
Description:
------------
When passing null to a optional nullable type argument, the default value is overwritten.
Test script:
---------------
<?php
function get(string $id, ?int $limit = 1, ?string $type = 'standard', ?array $options =
[]){
var_dump($limit);
var_dump($type);
}
get(1, null, 'custom');
get(1, 10, null, ['my'=>'option']);
Expected result:
----------------
Since 7.1 when the nullable types could be marked as null the situation where one needs to call a
function while skipping some parameters is met with overwrite of the default values of the function
arguments.
For the above test script, when passing null and the argument is specifically declared as a nullable
type, the parser should know to take the default value instead of overriding it as NULL.
feature-php.php:4:
1
feature-php.php:5:
string(6) "custom"
feature-php.php:4:
int(10)
feature-php.php:5:
standard
Actual result:
--------------
feature-php.php:4:
NULL
feature-php.php:5:
string(6) "custom"
feature-php.php:4:
int(10)
feature-php.php:5:
NULL
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=76412&edit=1