Hi Joshua On Mon, 23 Feb 2026 21:29:19 +0000, [email protected] wrote:
> https://wiki.php.net/rfc/readonly-variables First of all, thank you for your proposal and the effort you've put into the implementation. I'm skeptical about the usefulness of local immutability as a whole. I personally don't recognize local mutability as a significant source of bugs, contrary to action at a distance. Putting that aside: I understand your implementation is a proof-of-concept, but the approach looks wrong to me. I think if local immutability is added, it should mostly be a compile-time concept. The implementation currently add a new opcode for readonly assignment, and touches all existing assignments to add immutability checks. This seems mostly unnecessary with few exceptions (those being var-vars, globals, extract, pass-by-reference reference promotion, etc.), as the compiler can assert that the variable being assigned to isn't marked as readonly. The implementation shows an instruction count increase of 5.2%, 1.3% and 2.1% for Zend/bench.php, Symfony Demo and Wordpress, respectively. That should mostly go away with a compile time approach. There are likely also some limitations to the compile-time approach: - Without runtime tracking of readonly (and the concept of block scoping) every variable name could only be declared once in a function. - Disallowing `$readonly['foo'] = 'bar';` at compile-time will incorrectly restrict ArrayOffset, which I personally find acceptable. - Similar to the above, compile-time checks are insufficient for future value types. [1] `$readonly->foo = 'bar';` should fail if $readonly is a value type, which will necessarily require additional runtime checks. This is further complicated by `$readonly->foo->bar = 'baz';`, which should fail _only_ if $readonly->foo itself is also a value type. Given this issue applies to arbitrarily long chains, I don't know how this could be solved. For the reasons mentioned, I don't think I'd support this RFC in any form. Nonetheless, I appreciate the care that has gone both into the RFC and implementation. Ilija [1] https://wiki.php.net/rfc/structs-v2
