[PHP-DEV] [RFC] Typed array declarations
[email protected] (Wendell Adriel) Thu, 16 Jul 2026 10:23:34 +0100
| Newsgroups | php.internals |
|---|---|
| Message-ID | <CA+1VZ8ueEi_11LBPro_sVzLdBNsF6WuWuzC=d7m781a5cv7xtQ@mail.gmail.com> |
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>*