On Thu, Jan 9, 2020 at 10:15 AM Nikita Popov <nikita....@gmail.com> wrote:

> Hi internals,
>
> I've prepared https://github.com/php/php-src/pull/5068 to fix validation
> of
> abstract methods inside traits for PHP 8.
>
> To provide some context, the situation is currently pretty weird... when
> you add an abstract method in a trait, you obviously do that because the
> trait requires that method to exist with the given signature. However, this
> is currently enforced only spottily:
>
>  * It is not enforced in the most common case, where the method
> implementation is provided by the using class: https://3v4l.org/SeVK3
>  * It is enforced if the implementation comes from a parent class:
> https://3v4l.org/4VCIp
>  * It is enforced if the implementation comes from a child class:
> https://3v4l.org/q7Bq2
>
> I believe that an abstract methods signature coming from a trait should
> always be enforced.
>
> Conversely, we currently have some very weird code lying around that
> instead does a bi-directional signature enforcement if there are two traits
> specifying the same abstract method: https://3v4l.org/8Ze2C
>
> I believe this case should be valid instead, as the implementation of the
> method provided by the class satisfies both signatures.
>
> Does anyone see an issue with making these validation changes for PHP 8? I
> can also make an RFC for this, but it seems more like an implementation bug
> to me (especially seeing how there's about zero test coverage for any of
> this).
>

+1, for improving logical coherence around traits and for simplifying the
engine code.

Since @nicolas-grekas demonstrated a legitimate BC break, I think we do
need an RFC. That would also give some time to discuss merits of private
abstract declarations in traits.

Reply via email to