Asymmetric visibility lets a property have one visibility for reading and another for writing, so anyone can read it but only the class can change it. PHP 8.4 added this for object properties but left out static properties. This RFC from Ilija Tovilo and Larry Garfield extends it to static properties.
The original RFC skipped static properties on purpose. The authors expected them to be hard to implement and saw few use cases. Later they found the implementation was simpler than expected, so this RFC adds it to make the feature complete.
Show me
Here's the RFC's example, trimmed:
class Example { public private(set) static string $classTitle = 'Example class'; // Public to read, like object properties. protected(set) static int $counter = 0; public static function changeName(string $name): void { // Inside the class, so this is allowed. self::$classTitle = $name; } } print Example::$classTitle; // Allowed. Example::$classTitle = 'Nope'; // Not allowed.
private(set) means only the class itself can write the property, while code outside the class can still read it.
How it works
Static properties follow the same rules the PHP 8.4 RFC set for object properties, with no special cases.
Some of those rules involve final. For example, private(set) makes a property implicitly final. PHP already supports final static properties, so that works as expected.
Two things are outside this RFC. Static properties still can't be readonly, and they still can't have property hooks. Both remain limited to object properties.
What it means for existing code
Nothing breaks. Existing static properties work the same way, and asymmetric visibility on object properties doesn't change either.
The vote
It passed 15 to 3, clearing the two-thirds majority it needed. Voting opened on February 12, 2025, and closed on February 26, 2025. The RFC targeted PHP 8.5, and the page marks it as implemented.