On Wed, 17 Feb 2016 09:25:50 -0500, Kevin Gessner wrote:

> Hello internals team!  I'd like to propose an RFC to allow traits to
> implement interfaces.
> 
> I've noticed s pattern in Etsy's code and elsewhere, where a trait
> provides a common implementation of an interface.  Classes that use the
> trait are required to also explicitly declare the interface to benefit. 
> I propose that traits be permitted to declare and implement interfaces. 
> Classes that use such a trait would then implement the interface, as
> though it were declared on the class, without declaring the interface
> explicitly.
> 
> I believe this small change would be a useful improvement to the OO
> system.  I've written a draft RFC, but I don't have karma to create the
> wiki page for it.  Could someone please grant wiki karma to my account,
> kevingessner?
> 
> I don't yet have an implementation, but I'll be starting on one once
> I've posted the RFC.  I look forward to your thoughts and feedback.
> 
> Thanks in advance -- Kevin
> 
> Kevin Gessner Staff Software Engineer etsy.com

tl;dr: +1 and I really think that this language addition is useful and 
makes sense.

Wow, I really want this feature. Reminds me of how powerful traits are in 
some other languages, such as Rust. It is very common to use traits to 
provide a common interface for something, but with some default 
implementations.

Logging is a great example. Your interface might look like this (a 
familiar one, eh?):

interface Logger
{
    public function log($level, $message, array $context = array());
    public function error($message, array $context = array());
    public function warning($message, array $context = array());
    // etc...
}

where the idea is that the `error()` and such methods are a convenience 
for calling `log()` with a specific logging level. Obviously, these 
methods will be implemented in the same fashion most of the time; a trait 
would be great:

trait LoggerTrait implements Logger
{
    abstract public function log($level, $message, array $context = array
());
    public function error($message, array $context = array()) {
        return $this->log(ERROR, $message, $context);
    }
    // etc...
}

With this approach, I totally agree that allowing the `LoggerTrait` to 
implement the interface makes sense; it allows implementation to be 
enforced at the trait level. The second proposal that infers the interface 
implementation when using the trait is nice too (though not completely 
mandatory). It is pretty much the same situation where you do not have to 
re-implement an interface when extending a base class that already 
implements it.

-- 
Stephen

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to