あなたができないので、本当に短いバージョンはより簡単です。それは特性がどのように機能するかではありません。
use SomeTrait;
PHPで書くときは、(事実上)コンパイラーにコードをコピーしてTraitから使用されているクラスに貼り付けるように指示しています。
use SomeTrait;
はクラス内にあるため、クラスに追加できませんimplements SomeInterface
。クラス外にある必要があるためです。
「PHPで特性タイプがないのはなぜですか?」
インスタンス化できないためです。トレイトは、コードで参照できるオブジェクトや型とは対照的に、実際には単なる言語構造(トレイトコードをコピーしてこのクラスに貼り付けるようにコンパイラーに指示する)です。
だから、私は自分の特性を使用したいすべてのクラスがインターフェースを実装しなければならないコードで「設計」したいと思います。
これは、抽象クラスを使用し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();
ただし、トレイトを使用するクラスに特定のメソッドがあることを強制する必要がある場合は、そもそも抽象クラスであるはずのトレイトを使用している可能性があります。
または、ロジックが間違っていること。インターフェイスを実装するクラスに特定の関数があることを要求することを意図しています。特定の関数がある場合は、インターフェイスを実装していると宣言する必要があります。
編集
実際には、Traits内で抽象関数を定義して、クラスにメソッドを実装させることができます。例えば
trait LoggerTrait {
public function debug($message, array $context = array()) {
$this->log('debug', $message, $context);
}
abstract public function log($level, $message, array $context = array());
}
ただし、これでもトレイトにインターフェイスを実装することはできず、クラスが満たす必要のあるコントラクトを定義する際にインターフェイスがトレイトよりもはるかに優れているため、デザインが悪いように感じられます。