>  기사  >  백엔드 개발  >  (일반) 유형 매개변수를 제한하는 방법이 있나요?

(일반) 유형 매개변수를 제한하는 방법이 있나요?

王林
王林앞으로
2024-02-09 13:18:19427검색

(일반) 유형 매개변수를 제한하는 방법이 있나요?

PHP 편집자 Youzi는 다음과 같은 일반적인 질문에 대해 논의했습니다. (범용) 유형 매개변수를 제한하는 방법이 있습니까? PHP에서는 전달된 매개변수가 특정 유형 요구사항을 충족하는지 확인하기 위해 함수나 메소드의 매개변수에 유형 제한을 적용해야 하는 경우가 많습니다. 그러나 현재 배열이나 객체와 같은 일반 유형 매개변수를 제한하는 직접적인 방법은 없습니다. 그러나 매개변수의 정확성과 일관성을 보장하기 위해 보다 엄격한 유형 검사 논리를 작성하여 일반 유형 매개변수에 대한 제약조건을 구현할 수 있습니다. 이 기사에서는 일반 유형 매개변수 제약조건을 구현하는 여러 가지 방법과 그 장단점을 살펴보겠습니다.

질문 내용

제네릭을 이제 막 배우기 시작했어요. 그래서 일부 protobuf 메시지에서 실행되는 사용자 지정 데이터베이스용 드라이버를 일반화하려고 합니다.

제네릭 유형을 추가로 제한하는 방법을 찾고 싶지만 포인터로서, 즉 제약 조건 e가 다른 메서드를 구현하는지 확인하세요(컴파일러에 알려주세요).

먼저, 데이터베이스가 처리할 수 있는 엔터티를 제한했습니다.

으아악

그런 다음 자체 원시 메시지를 처리하는 다양한 서비스에서 사용할 수 있도록 데이터베이스 기능을 설명하는 공통 인터페이스가 작성되었습니다.

으아악

지금까지는 너무 좋았습니다. 그러나 데이터베이스와 통신할 때 이러한 엔터티를 (역)직렬화하여 네트워크를 통해 전송하고 복제하고 병합할 수도 있습니다. 다음과 같은 것:

으아악

그러나 위 코드에서는 다음과 같은 오류가 발생합니다.

으아악

문제는 모든 엔터티 유형이 구현하는 proto.marshal 需要实体(*e)来实现 proto.message 接口,即 protoreflect() 메서드이지만 제약이 없으며 컴파일러에서 추론할 수 없습니다.

또한 엔터티를 다음과 같이 정의해 보았습니다.

으아악

그러나 이는 엔터티 포인터가 참조하는 proto.messages를 인스턴스화하기 위해 추가 protreflect 작업을 수행해야 한다는 사실 외에도 옳지 않다고 생각됩니다.

솔루션

다음을 수행할 수 있습니다.

으아악

위보다 더 간결한 구문을 원한다면 메시지 제약 조건을 취소할 수 있습니다.

으아악

https://www.php.cn/link/20ba66f905957b34253d9d7abde919f3

위 내용은 (일반) 유형 매개변수를 제한하는 방법이 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제