정말 짧은 버전은 할 수 없기 때문에 더 간단합니다. 그것은 특성이 작동하는 방식이 아닙니다.
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();
그러나-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());
}
그러나 이것은 여전히 특성에서 인터페이스를 구현하는 것을 허용하지 않으며, 클래스가 이행해야하는 계약을 정의 할 때 특성보다 인터페이스가 훨씬 낫기 때문에 여전히 나쁜 디자인처럼 냄새가납니다.