Phiên bản thực sự ngắn đơn giản hơn vì bạn không thể. Đó không phải là cách Traits hoạt động.
Khi bạn viết use SomeTrait;
bằng PHP, bạn đang (một cách hiệu quả) yêu cầu trình biên dịch sao chép và dán mã từ Trait vào lớp mà nó đang được sử dụng.
Bởi vì use SomeTrait;
bên trong lớp, nó không thể thêm implements SomeInterface
vào lớp, bởi vì cái đó phải ở bên ngoài lớp.
"tại sao không có kiểu Traits trong PHP?"
Bởi vì chúng không thể được khởi tạo. Đặc điểm thực sự chỉ là một cấu trúc ngôn ngữ (yêu cầu trình biên dịch sao chép và dán mã đặc điểm vào lớp này) trái ngược với một đối tượng hoặc kiểu có thể được tham chiếu bởi mã của bạn.
Vì vậy, tôi muốn "thiết kế" trong mã mà mọi lớp muốn sử dụng đặc điểm của tôi phải triển khai giao diện.
Điều đó có thể được thực thi bằng cách sử dụng một lớp trừu tượng cho use
đặc điểm và sau đó mở rộng các lớp từ nó.
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();
Tuy nhiên - nếu bạn cần thực thi rằng bất kỳ lớp nào sử dụng một Đặc điểm đều có một phương thức cụ thể, tôi nghĩ bạn có thể đang sử dụng các đặc điểm mà ngay từ đầu bạn đã phải là các lớp trừu tượng.
Hoặc bạn có logic của bạn sai cách. Bạn muốn yêu cầu các lớp triển khai giao diện có một số chức năng nhất định, không phải là nếu chúng có một số chức năng nhất định thì chúng phải tự khai báo là triển khai giao diện.
Biên tập
Trên thực tế, bạn có thể định nghĩa các hàm trừu tượng bên trong các Đặc điểm để buộc một lớp triển khai phương thức. ví dụ
trait LoggerTrait {
public function debug($message, array $context = array()) {
$this->log('debug', $message, $context);
}
abstract public function log($level, $message, array $context = array());
}
Tuy nhiên, điều này vẫn không cho phép bạn triển khai giao diện theo đặc điểm và vẫn có vẻ là một thiết kế tồi, vì các giao diện tốt hơn nhiều so với các đặc điểm trong việc xác định hợp đồng mà một lớp cần thực hiện.