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 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