On Sun, May 10, 2026, at 18:28, Daniel Scherzer wrote:
> Hi internals,
> 
> I'd like to start the discussion for a new RFC about adding friendship in 
> PHP. This is a follow-up to a pre-RFC discussion thread 
> https://externals.io/message/130710.
> 
> * RFC: https://wiki.php.net/rfc/friends
> * Implementation: https://github.com/php/php-src/pull/21937
> 
> Thanks,
> -Daniel

Hi Daniel,

I worked on the namespace visibility RFC before running out of time, and life 
isn't slowing down anytime soon; thus I wish you the best of luck with this one.

First of all ... the RFC doesn't address several inheritance/override 
interactions worth working through. I'd invite you to read the thread here: 
https://externals.io/message/129147 -- you're going to run into a lot of the 
same issues in this RFC (and especially the follow-up namespace one), and you 
have some of the same problems.

Take this example:

class P {
  friend F;
  private int $x = 0;
}
class C extends P {
  protected int $x = 0;
}
class F {
  static function set(P $p, int $v) { $p->x = $v; }
}
F::set(new C, 5); // fatal

The friend grant on P creates a non-local invariant that subclass authors of P 
can break without realizing. C's author, adding `x` for their own internal 
reasons, doesn't know they've broken some F that depends on the parent 
contract. C's tests pass. F's tests pass. Integration breaks at runtime in 
production. private(namespace) had the identical pathology.

— Rob

Reply via email to