今年の書き初めはPHPでした

昨年はJavaで書いたと思うが、今年はPHP

PHP5.4から利用できるTrait(Scalaでも同名)とInterfaceを利用した場合、 お作法としてTraitとInterfaceはセットで定義しておく。

理由としては、Traitは型宣言に利用できない(タイプヒント出来ない)為、 メソッドが特定の型を要求する場合は、タイプヒントする為にInterfaceを定義しておく必要がある。 (独習PHP10.5.4より参照で、この文の意味が理解不足)

・型を継承するインターフェース
・実装を継承するトレイト

この違いは理解したと思うが、メソッドが特定の型を要求する場合の為にInterfaceを定義しておくという 説明についてはコードレベルで理解出来ていない。

<?php

// 型を定義
interface IFax {
    function send();
}

interface IPrinter {
    function printer();
}

// 実装を定義
trait FaxTrait {
    public function send() {
        print 'sending Fax...sended!';
    }
}

trait PrinterTrait {
    public function printer() {
        print 'printing ... complete!';
    }
}

class FaxPrinter implements IFax, IPrinter {
    use FaxTrait, PrinterTrait;

}

$fp = new FaxPrinter();
$fp->send();
$fp->printer();