yiisoft/di

Non-nullable default parameters

BoShurik opened this issue · 5 comments

$container = new Container([
    'items' => [
        '__class' => ArrayIterator::class,
        '__construct()' => [
            [],
        ],
    ],
]);

$items = $container->get('items'); // Uncaught TypeError: ArrayIterator::__construct() expects parameter 2 to be int, null given

assert($items instanceof ArrayIterator); 
$container = new Container([
    'items' => [
        '__class' => ArrayIterator::class,
        '__construct()' => [
            ['one', 'two'],
        ],
    ],
]);

$items = $container->get('items'); // Uncaught TypeError: ArrayIterator::__construct() expects parameter 2 to be int, null given

assert($items instanceof ArrayIterator); 

Even

$container = new Container([
    'items' => [
        '__class' => ArrayIterator::class,
        '__construct()' => [
            [],
            0
        ],
    ],
]);

$items = $container->get('items'); // Uncaught TypeError: ArrayIterator::__construct() expects parameter 2 to be int, null given

assert($items instanceof ArrayIterator); 

but

$container = new Container([
    'items' => [
        '__class' => ArrayIterator::class,
        '__construct()' => [
            ['one', 'two'],
            0
        ],
    ],
]);

$items = $container->get('items');

assert($items instanceof ArrayIterator); // Ok

Very good point! Thank you!
I'll try to fix it.

That's a PHP issue :)
https://3v4l.org/7CGBZ
Reflection returns wrong information.
Looks like fixed in PHP 8.

Also, please see test in #172
The container process default parameters correctly.

@hiqsol but why

'__construct()' => [
    [],
    0
],

does not work?

It's a bug. Fixing it.