Hi internals,
I'd like to add support for friendship in PHP. I don't mean friendship in
the PSR-8 huggable way, but rather in the C++ way of allowing access to
non-public parts of a class without needing to use Reflection.
I haven't started work on implementing this yet, but there is a big
question about how to indicate friendship that I wanted to get some
feedback on. Specifically, should it be added with a new keyword, or with
an attribute?
Keyword
- matches C++
- suggests that friends are aspects of the class, like properties and
constants and methods - but would look a bit ugly if we added support for friends that are just
for specific properties/methods/constants
Attribute
- matches how other metadata is added to classes
- would make it look cleaner if subsequently support was added for
friendship being applied to specific properties/methods/constants - would differ from the current builtin attributes in that it doesn't just
add/remove warnings, but changes some functionality
For a more in-depth explanation of the inspiration and these two potential
approaches, see https://scherzer.dev/Blog/20260309-php-friends. To be
clear, I have not yet written an implementation, much less the RFC, but I
wanted to get some initial feedback on if people would prefer a new
keyword, or an attribute, for declaring friends.
-Daniel
Hi
Am 2026-04-29 19:30, schrieb Daniel Scherzer:
I haven't started work on implementing this yet, but there is a big
question about how to indicate friendship that I wanted to get some
feedback on. Specifically, should it be added with a new keyword, or
with
an attribute?
It should be a proper keyword for the reasons that are also mentioned in
your blog post: Attributes are not part of the public API and thus do
not contribute to e.g. LSP checks. They are also expected to gracefully
degrade when they do not exist, which means that running code written
with friendship in mind on older PHP versions will silently expose a
different API instead of failing in a visible way.
See also the reasoning that I provided in the #[\Override] RFC:
https://wiki.php.net/rfc/marking_overriden_methods#why_an_attribute_and_not_a_keyword.
I think the related mailing list discussion provides additional context
- and I seem to remember I wrote something similar in some other RFC
discussion as well.
Best regards
Tim Düsterhus
Hi internals,
I'd like to add support for friendship in PHP. I don't mean friendship in the PSR-8 huggable way, but rather in the C++ way of allowing access to non-public parts of a class without needing to use Reflection.
I haven't started work on implementing this yet, but there is a big question about how to indicate friendship that I wanted to get some feedback on. Specifically, should it be added with a new keyword, or with an attribute?
Keyword
- matches C++
- suggests that friends are aspects of the class, like properties and constants and methods
- but would look a bit ugly if we added support for friends that are just for specific properties/methods/constants
Attribute
- matches how other metadata is added to classes
- would make it look cleaner if subsequently support was added for friendship being applied to specific properties/methods/constants
- would differ from the current builtin attributes in that it doesn't just add/remove warnings, but changes some functionality
For a more in-depth explanation of the inspiration and these two potential approaches, see https://scherzer.dev/Blog/20260309-php-friends. To be clear, I have not yet written an implementation, much less the RFC, but I wanted to get some initial feedback on if people would prefer a new keyword, or an attribute, for declaring friends.
-Daniel
Hi Daniel,
We saw some friendship discussions in my nested class RFC, where nested classes implicitly became friends of the outer class. I'd recommend checking those threads for feedback about friendship and scope.
— Rob