Hi all,

I'm running into something which peaked my curiousity due to its unexpected behaviour, so I'm writing to the list in the hopes of finding out whether this is by design, a bug or an oversight which should be fixed (via an RFC?).

> The precedence order is that members from the current class override Trait methods, which in turn override inherited methods. Source: https://www.php.net/manual/en/language.oop5.traits.php#language.oop5.traits.precedence

If one would want to prevent the "current class" from being able to override a trait method, I would expect that the `final` keyword would be able to do this, just like it would when a method is inherited from a parent class.

Unfortunately, that does not seem to work and it appears that the current class can freely override final methods from a trait:

```
trait Foo {
    final protected function bar() {
        echo 'Foo';
    }
}

class FooBar {
    use Foo;

    public function __construct() {
        $this->bar();
    }

    protected function bar() {
        echo 'FooBar';
    }
}

new FooBar(); // Prints "FooBar".
```
https://3v4l.org/hlirb

Which brings me to my second point: in PHP 8.0 the use of the `final` keyword with `private` methods has been turned into a `warning` via this RFC: https://wiki.php.net/rfc/inheritance_private_methods

... but the "current class" has access to `private` methods inherited from a trait, so I would expect `final private` methods in traits to be exempt from that warning, but turns out that that will still throw the warning: https://3v4l.org/Vb0S2

Is there anyone who can shed some light on this behaviour ?

Smile,
Juliette

Reply via email to