Насправді коротка версія простіша, тому що ви не можете. Не так працюють Риси.
Коли ви пишете use SomeTrait;
на PHP, ви (фактично) говорите компілятору скопіювати та вставити код із Trait у клас, де він використовується.
Оскільки use SomeTrait;
всередині класу, воно не може додаватись implements SomeInterface
до класу, оскільки це повинно бути поза класом.
"чому в PHP немає типів Traits?"
Тому що їх неможливо створити. Трейти - це насправді лише мовна конструкція (вказівка компілятору скопіювати та вставити код ознаки в цей клас) на відміну від об’єкта чи типу, на який може посилатися ваш код.
Отже, я хочу "розробити" в коді, що кожен клас, який хоче використовувати мою рису, повинен реалізовувати інтерфейс.
Це можна застосувати, використовуючи абстрактний клас до use
ознаки, а потім розширюючи класи з нього.
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();
Однак - якщо вам потрібно домогтися того, щоб будь-який клас, який використовує Trait, мав певний метод, я думаю, ви, можливо, використовуєте риси, де ви мали б бути абстрактними класами в першу чергу.
Або що у вас логіка неправильна. Ви повинні вимагати, щоб класи, які реалізують інтерфейси, мали певні функції, а не те, що якщо вони мають певні функції, вони повинні заявити про себе як про реалізацію інтерфейсу.
Редагувати
Насправді ви можете визначити абстрактні функції всередині Traits, щоб змусити клас реалізувати метод. напр
trait LoggerTrait {
public function debug($message, array $context = array()) {
$this->log('debug', $message, $context);
}
abstract public function log($level, $message, array $context = array());
}
Однак це все ще не дозволяє вам реалізувати інтерфейс в ознаці, і все одно пахне поганим дизайном, оскільки інтерфейси набагато кращі за риси при визначенні контракту, який повинен виконати клас.