Naprawdę krótka wersja jest prostsza, ponieważ nie możesz. Nie tak działają cechy.
Kiedy piszesz use SomeTrait;
w PHP, mówisz (efektywnie) kompilatorowi, aby skopiował i wkleił kod z cechy do klasy, w której jest używany.
Ponieważ element use SomeTrait;
znajduje się wewnątrz klasy, nie można go dodawać implements SomeInterface
do klasy, ponieważ musi znajdować się poza klasą.
„Dlaczego w PHP nie ma typów cech?”
Ponieważ nie można ich utworzyć. Cechy są tak naprawdę konstrukcją językową (nakazującą kompilatorowi skopiowanie i wklejenie kodu cechy do tej klasy) w przeciwieństwie do obiektu lub typu, do którego może się odwoływać Twój kod.
Tak więc chcę „zaprojektować” w kodzie, że każda klasa, która chce używać mojej cechy, musi zaimplementować interfejs.
Można to wymusić, używając klasy abstrakcyjnej do use
cechy, a następnie rozszerzając z niej klasy.
interface SomeInterface{
public function someInterfaceFunction();
}
trait SomeTrait {
function sayHello(){
echo "Hello my secret is ".static::$secret;
}
}
abstract class AbstractClass implements SomeInterface{
use SomeTrait;
}
class TestClass extends AbstractClass {
static public $secret = 12345;
}
$test = new TestClass();
$test->sayHello();
Jednak - jeśli musisz wymusić, że jakakolwiek klasa, która używa cechy, ma określoną metodę, myślę, że możesz używać cech, w których powinieneś był przede wszystkim klasami abstrakcyjnymi.
Albo że masz złą logikę. Masz wymagać, aby klasy, które implementują interfejsy, miały określone funkcje, a nie to, że jeśli mają pewne funkcje, muszą zadeklarować się jako implementujące interfejs.
Edytować
Właściwie możesz zdefiniować abstrakcyjne funkcje wewnątrz Traits, aby wymusić na klasie implementację metody. na przykład
trait LoggerTrait {
public function debug($message, array $context = array()) {
$this->log('debug', $message, $context);
}
abstract public function log($level, $message, array $context = array());
}
Jednak to nadal nie pozwala na zaimplementowanie interfejsu w tej funkcji i nadal pachnie jak zły projekt, ponieważ interfejsy są znacznie lepsze niż cechy w definiowaniu kontraktu, który klasa musi spełnić.