Hi,

Wanted to bring up an inconsistent behavior of callable arguments compared to 
arguments of other types.
Callable argument cannot have a default value (tested string or array types - 
both are not permitted).
The same exact value works perfectly fine when passed dynamically, it just 
cannot be specified as a default.
The workaround is to remove the type annotation which is obviously undesirable.

Here’s an example:
declare(strict_types=1);
function test(callable $idGenerator = 'session_create_id') {
    $id = $idGenerator();
    // ...
}

The function/method declaration above produces the following error on all PHP 
versions:
Fatal error: Cannot use string as default value for parameter $idGenerator of 
type callable in /tmp/preview on line 4

Note that the exact same string argument can be passed without any issue:
function test(callable $idGenerator) {…}
test('session_create_id’);

Is there a specific architectural limitation causing this that's 
hard/impossible to overcome?

I’m aware that class properties cannot be annotated with callable - another 
unfortunate limitation.
Callable is not a real type like other primitive types which causes all these 
inconsistencies, correct?
Callable properties (separate topic) may be a challenge, but can at least 
argument defaults be supported?

Regards,
Sergii Shymko

Reply via email to