development

PHP 인터페이스에 속성이 있습니까?

big-blog 2020. 12. 25. 22:42
반응형

PHP 인터페이스에 속성이 있습니까?


PHP의 인터페이스에 속성이 있습니까, 아니면 메서드 만 있습니까?


"속성"이 의미하는 바에 따라 다릅니다. 실제 필드를 의미하는 경우 아니오, 그렇지 않습니다. C #의 속성과 같은 속성을 참조하는 경우 가능합니다 (속성 접근자는 접근 자 메서드에 대한 엄격하게 구문 설탕이기 때문에). 이벤트도 마찬가지입니다 (물론 각 경우에 get/ set또는 add/ remove접근 자에 대한 구현이 지정되지 않음 ).

업데이트 : PHP에는 get/ set접근 자의 의미에서 속성 이 없으므로 질문에 대한 대답은 아니오입니다. 인터페이스는 자체 데이터 / 상태를 전달할 수 없습니다.


PHP의 인터페이스 는 메서드 본문없이 공용 메서드 서명 만 포함 할 수 있습니다 . 상수도 포함 할 수 있습니다. 하지만 그게 다입니다. 다른 건 없습니다.

참조 http://www.php.net/manual/en/language.oop5.interfaces.php를

인터페이스는 표준 클래스와 같은 방식으로 interface 키워드를 사용하여 정의되지만 내용이 정의 된 메서드는 없습니다. […] 인터페이스에 선언 된 모든 메서드는 공용이어야합니다. 이것이 인터페이스의 특성입니다. […] 인터페이스가 상수를 가질 수 있습니다. 인터페이스 상수는 상속 된 클래스 / 인터페이스에 의해 재정의 될 수 없다는 점을 제외하고는 클래스 상수와 똑같이 작동합니다.


PHP 인터페이스는 상수를 가질 수 있지만 속성 (인스턴스 변수)은 가질 수 없습니다. "속성"을 수정할 필요가 없으면 대신 상수를 사용할 수 있습니다.


인터페이스에 대한 DocBlock에서 속성을 선언 할 수 있습니다. 그런 다음 IDE는 인터페이스에 대한 해당 속성을 힌트하지만 (PhpStorm이 수행함) 구현 클래스에서 이러한 필드의 실제 구현을 강제하지는 않습니다. 예.

/**
 * @property string $password
 * @property string $username
 */
interface IUserDocument
{


}

인터페이스에 속성이 필요한 [유효한] 이유는 DTO 클래스에 특정 측면 (예 : IOrderable {OrderDate, OrderStatus}, IDeliverable {DeliveryAddress, Route, ...} 등)이 있음을 지정하는 것입니다. 측면은 다음에서 사용할 수 있습니다. 판매 주문, 작업 주문, 판매 송장 등과 같은 다수의 DTO. DTO 클래스는 여러 측면, 즉 데이터 클래스에서 바람직한 다중 상속을 지원할 수 있습니다 (코드 클래스는 아님). 그 후, DTO의 클라이언트는 해당 측면 (인터페이스 계약)을 통해 DTO를 볼 수 있음을 확신합니다. 이 패턴은 5 가지 SOLID 원칙을 모두 준수합니다.

PHP에서 인터페이스 속성에 가장 가까운 속성은 http://php.net/manual/en/language.oop5.traits.php 입니다. 인터페이스와 유사하게 특성은 인스턴스화 할 수 없지만 구현하지 않고 클래스에서 직접 사용할 수 있습니다.

참조 URL : https://stackoverflow.com/questions/2756974/do-php-interfaces-have-properties

반응형