Hi everyone,

I've been off for quite a while from internals, so I'm going to
re-introduce myself briefly.

I'm Wendell Adriel, I've been working with PHP since 2009.
Worked over a decade with PHP enterprise applications, and currently I'm
working as a Senior Software Engineer in the Laravel OSS Team. You can
check more about me on my website (link in my email signature).

I would like to propose native type declarations for PHP array keys and
values. The RFC draft is available at:

https://wiki.php.net/rfc/typed_array_declarations

The proposal adds `array<TValue>` for integer-keyed arrays and `array<TKey,
TValue>` when the key type must be declared explicitly. Plain `array`
declarations remain unchanged.

The RFC proposes three implementation levels that share the same syntax and
Reflection metadata, but they provide different runtime guarantees:

```php
final class ProductCatalog
{
    public array<string, Product> $products = [];
}

$catalog = new ProductCatalog();

$catalog->products = ['featured' => new stdClass()]; // Whole-property
assignment
$catalog->products['featured'] = new stdClass();      // Direct dimension
write
```

- **Level 1** parses the declaration and exposes it through Reflection, but
does not validate elements. Both writes are accepted.
- **Level 2** validates keys and values when an array crosses a declared
boundary, such as a complete property assignment, argument, return value,
default, or typed class constant. The first write throws `TypeError`, but
the direct dimension write is still accepted.
- **Level 3** includes Level 2 and enforces the constraint for later
property mutations and references. Both writes throw `TypeError` before the
invalid value is stored.

I currently recommend Level 3 for typed properties because it preserves the
guarantee the declaration appears to make. There is no implementation yet,
because I first wanted to see which implementation level would be accepted.
I will work on one after incorporating early feedback.

I would appreciate any feedback, especially on the runtime semantics and
the appropriate implementation level.

Thanks in advance!

*---*
*Best Regards,*
*Wendell Adriel.*
*Software Engineer & Architect*
*https://wendelladriel.com <https://wendelladriel.com>*

Reply via email to