> 백엔드 개발 > PHP 튜토리얼 > PHP에서 엄격하게 입력 한 배열 및 컬렉션 작성

PHP에서 엄격하게 입력 한 배열 및 컬렉션 작성

Christopher Nolan
풀어 주다: 2025-02-10 11:20:11
원래의
129명이 탐색했습니다.

PHP에서 엄격하게 입력 한 배열 및 컬렉션 작성 키 테이크 아웃

PHP 5.6은… 토큰을 사용하여 유형 배열을 만들 수있는 기능을 도입했습니다. 이 기능은 유형 힌트와 결합하여 특정 유형의 객체 만 배열에서 허용되도록 할 수 있습니다. 이 기능의 한 가지 제한은 하나의 유형 배열 만 방법 당 정의 할 수 있다는 것입니다. 이를 극복하기 위해 타이핑 된 배열을 "수집"클래스에 주입 할 수 있으며,이를 통해 Get 메소드에서 "배열"보다 더 특정한 반환 유형이 가능합니다. 값 객체는 사용자 정의 검증에 사용될 수 있습니다. 예를 들어, 등급 값 객체는 제약 조건으로 작성하여 등급이 항상 0과 5 사이인지 확인할 수 있습니다. 이는 각 주입 된 개체를 반복하지 않고 개별 컬렉션 멤버의 추가 검증을 제공합니다.

. 엄격하게 입력 한 배열 및 컬렉션에는 몇 가지 장점이 있습니다. 그들은 한 곳에서 쉬운 유형 검증을 제공하고, 구성시 항상 값이 검증되었는지 확인하고, 컬렉션 당 사용자 정의 로직을 추가 할 수 있으며, 메소드 서명에서 인수를 혼합 할 확률을 줄입니다.

. 초기 구성 후 수집 및 값 값에 대한 편집을 용이하게하는 방법을 추가 할 수는 있지만 변경이 필요할 때 불변을 유지하고 원시 유형으로 변환하는 것이 더 효율적입니다. 변경 후 컬렉션 또는 값 객체를 업데이트 된 값으로 재구성 할 수 있으며 다시 검증됩니다.
    .
  • 이 게시물은 처음으로 매체에 나타 났으며 저자의 허가로 여기에서 다시 게시되었습니다. 우리는 당신이 매체의 Bert를 따르고 그에게 그에게 좋아하는 것을 제공하는 것이 좋습니다!
  • PHP 5.6에서 발표 된 언어 기능 중 하나는 기능이나 메소드가 가변 길이의 인수를 받아 들인다는 것을 나타내는 토큰을 추가하는 것입니다. 내가 언급하지 않은 것은이 기능을 유형 힌트와 결합하여 본질적으로 입력 된 배열을 생성 할 수 있다는 것입니다. 예를 들어 우리는 dateTimeImmutable 객체 만 받아들이는 에어 날짜 배열을 설정하는 메소드가있는 영화 클래스를 가질 수 있습니다.
  • 이제 우리는 이제 변수의 별도의 dateTimeImutable 객체를 setAirDates () 메소드에 전달할 수 있습니다.
  • 우리가 datetimeimmutable 이외의 다른 것을 통과하려면, 예를 들어, 치명적인 오류가 발생합니다 : .
  • 대신 SetAirdates ()로 전달하려는 DateTimeImutable 객체의 배열이 있으면 ... 토큰을 다시 사용할 수 있었지만 이번에는 포장을 풀기 위해 다음을 사용할 수 있습니다.
  • 배열에 예상 유형이 아닌 값이 포함되어 있다면 앞에서 언급 한 치명적인 오류가 여전히 나타납니다. 또한 PHP 7에서 시작하여 스칼라 유형을 동일한 방식으로 사용할 수 있습니다. 예를 들어, 영화 클래스의 플로트로 등급 목록을 설정하는 메소드를 추가 할 수 있습니다.

    다시, 이렇게하면 등급 속성에 모든 내용을 루프하지 않고도 등급 속성에 플로트가 포함되어 있는지 확인합니다. 이제 우리는 유효하지 않은 유형에 대해 걱정할 필요없이 getaveragerating ()에서 수학 작업을 쉽게 수행 할 수 있습니다. 이런 종류의 유형 배열 문제 이 기능을 입력 한 배열로 사용하는 다운 사이드 중 하나는 방법 당 이러한 배열 만 정의 할 수 있다는 것입니다. 옵션 방법을 통해 나중에 설정하는 대신 생성자의 등급 목록과 함께 에어 데이트 목록을 기대하는 영화 클래스를 갖고 싶다고 가정 해 봅시다. 위에서 사용 된 방법으로는 불가능합니다.

    또 다른 문제는 PHP 7을 사용할 때 get () 메소드의 리턴 유형이 여전히“배열”이어야한다는 것입니다. 솔루션 : 수집 클래스 두 가지 문제를 모두 해결하기 위해 소위 "수집"클래스 내부에 타이핑 된 배열을 간단히 주입 할 수 있습니다. 또한 평균 등급의 계산 방법을 관련 컬렉션 클래스로 이동할 수 있기 때문에 우려 사항의 분리를 향상시킵니다.
    <span><span><?php
    </span></span><span>
    </span><span><span>class Movie {  
    </span></span><span>  <span>private $dates = [];
    </span></span><span>
    </span><span>  <span>public function setAirDates(\DateTimeImmutable ...$dates) {
    </span></span><span>    <span>$this->dates = $dates;
    </span></span><span>  <span>}
    </span></span><span>
    </span><span>  <span>public function getAirDates() {
    </span></span><span>    <span>return $this->dates;
    </span></span><span>  <span>}
    </span></span><span><span>}
    </span></span>
    로그인 후 복사
    로그인 후 복사
    우리가 여전히 생성자에 가변 길이가있는 유형의 인수 목록을 어떻게 사용하고 있는지 확인하여 각 등급에 대한 루핑에 문제가 발생하여 유형을 확인합니다.

    . Foreach Loops 에서이 컬렉션 클래스를 사용할 수있는 기능을 원한다면 ITERATORAGGEGRAGE 인터페이스를 구현하면됩니다.

    계속해서, 우리는 에어 날짜 목록에 대한 컬렉션을 만들 수도 있습니다.

    피즐의 모든 부분을 영화 클래스에 모으기 위해 이제 생성자에 별도로 타이핑 된 두 개의 컬렉션을 주입 할 수 있습니다. 또한 GET 메소드에서 "배열"보다보다 특정한 반환 유형을 정의 할 수 있습니다.

    사용자 정의 검증에 값 객체 사용 등급에 추가 검증을 추가하려면 한 걸음 더 나아가고 사용자 지정 제약 조건으로 등급 값 객체를 정의 할 수 있습니다. 예를 들어, 등급은 0과 5 : 로 제한 될 수 있습니다.

    Ratings Collection 클래스로 돌아와서, 우리는 플로트 대신 이러한 값 객체를 사용하기 위해 약간의 변경 만하면됩니다.

    이 방법으로 우리는 개별 컬렉션 멤버의 추가 검증을받습니다. 장점

    이 별도의 컬렉션 클래스와 값 객체를 입력하는 것은 많은 작업처럼 보일 수 있지만 일반적인 배열과 스칼라 값에 비해 몇 가지 장점이 있습니다.

    한 곳에서 쉬운 유형 검증. 우리는 컬렉션 멤버의 유형을 검증하기 위해 배열을 수동으로 루프 할 필요가 없습니다.

  • 응용 프로그램에서 이러한 컬렉션과 가치 객체를 사용하는 곳마다, 우리는 그들의 값이 항상 건설시 검증되었음을 알고 있습니다. 예를 들어, 모든 등급은 항상 0과 5 사이입니다.

    컬렉션 및/또는 값 객체 당 사용자 정의 로직을 쉽게 추가 할 수 있습니다. 예를 들어 전체 응용 프로그램 전체에서 재사용 할 수있는 getAverage () 메소드;

    우리는 단일 함수 또는 메소드에 여러 유형의 목록을 주입 할 가능성을 얻습니다. 이는 컬렉션 클래스의 값을 먼저 주입하지 않고도 토큰을 사용할 수 없습니다.
  • 메소드 서명에서 인수를 혼합 할 확률이 크게 줄어 듭니다. 예를 들어, 등급 목록과 에어 데이트 목록을 모두 주입하려면 일반 어레이를 사용할 때 건설시 실수로 쉽게 혼합 될 수 있습니다.
  • 편집은 어떻습니까? 지금까지 초기 구성 후 수집 및 값 객체의 값을 어떻게 변경할 수 있는지 궁금 할 것입니다. 편집을 용이하게하는 방법을 추가 할 수는 있지만, 유형 힌트의 이점을 유지하기 위해 각 컬렉션의 대부분의 메소드를 복제해야하기 때문에 빠르게 번거롭게됩니다. 예를 들어, 등급에 대한 add () 메소드는 등급 객체 만 허용해야하며 Airdates의 add () 메소드는 DateTimeImmutable 객체 만 허용해야합니다. 이것은 이러한 방법의 인터페이스 및/또는 재사용을 매우 어렵게 만듭니다.

    대신, 우리는 단순히 컬렉션과 가치 객체를 불변으로 유지하고 변경해야 할 때 원시 유형으로 변환 할 수 있습니다. 변경을 마치면 업데이트 된 값으로 필요한 컬렉션 또는 값 객체를 간단하게 재구성 할 수 있습니다. (재) 구성시 모든 유형이 다시 검증되며, 우리가 정의했을 수있는 추가 검증과 함께. 예를 들어, 우리는 컬렉션에 간단한 toArray () 메소드를 추가하고 다음과 같이 변경할 수 있습니다.

    이 방법으로 array_filter ()와 같은 기존 배열 기능을 재사용 할 수도 있습니다. 컬렉션 객체 자체를 편집해야한다면 필요한 경우 필요한 방법으로 필요한 방법을 추가 할 수 있습니다. 그러나 대부분의 사람들은 주어진 인수의 유형 검증을 수행해야하므로 모든 다른 컬렉션 클래스에서 재사용하기가 어렵습니다.
  • . 일반 메소드 재사용
  • 당신이 알 수 있듯이, 우리는 모두 toArray ()와 getiterator ()를 모두 구현하여 수집 클래스에서 일부 코드 복제를 받고 있습니다. 운 좋게도이 방법은 주입 된 배열을 단순히 반환하기 때문에 일반적인 부모 클래스로 이동하기에 충분히 일반적입니다.

    컬렉션 클래스에 남겨 두는 것은 생성자의 유형 검증과 다음과 같이 해당 컬렉션에 특정한 선택적 추가 로직입니다.

    <span><span><?php
    </span></span><span>
    </span><span><span>class Movie {  
    </span></span><span>  <span>private $dates = [];
    </span></span><span>
    </span><span>  <span>public function setAirDates(\DateTimeImmutable ...$dates) {
    </span></span><span>    <span>$this->dates = $dates;
    </span></span><span>  <span>}
    </span></span><span>
    </span><span>  <span>public function getAirDates() {
    </span></span><span>    <span>return $this->dates;
    </span></span><span>  <span>}
    </span></span><span><span>}
    </span></span>
    로그인 후 복사
    로그인 후 복사
    선택적으로 우리는 유형 검증을 취소 할 수있는 방식으로 아동 클래스가 값 속성을 엉망으로 만드는 것을 방지하기 위해 컬렉션을 최종적으로 만들 수 있습니다.

    결론 아직 완벽하지는 않지만, 최근 PHP의 릴리스와 함께 컬렉션 및 가치 객체에서 유형 검증으로 작업하기가 꾸준히 더 쉬워졌습니다. 이상적으로 우리는 재사용 가능한 컬렉션 클래스의 생성을 더욱 촉진하기 위해 미래의 PHP 버전에서 어떤 형태의 제네릭을 얻을 것입니다. 값 객체의 사용법을 크게 향상시키는 기능은 문자열 외에도 다른 원시 유형에 객체를 캐스팅하는 능력입니다. 이것은 __toint (), __tofloat () 등과 같이 __tostring ()에 비슷한 추가 마법 방법을 추가하여 쉽게 구현할 수 있습니다. 운 좋게도 이후 버전에서 두 기능을 모두 구현할 수있는 RFC가 있으므로 손가락이 교차했습니다! ?

    제네릭 : https://wiki.php.net/rfc/generics

    일반 배열 : https://wiki.php.net/rfc/generic-arrays 스칼라에 객체를 주조 : https://wiki.php.net/rfc/class_casting_to_scalar

    이 튜토리얼이 도움이된다면 매체의 원래 게시물을 방문하여 ❤️을 제공하십시오. 피드백, 질문 또는 의견이 있으시면 아래에 나가거나 원본 게시물의 응답으로 남겨주세요. php 에서 엄격하게 입력 한 배열 및 컬렉션을 만드는 것에 대한 자주 묻는 질문 (FAQ) PHP에서 엄격하게 입력 한 배열을 사용하면 어떤 이점이 있습니까?

    PHP의 엄격하게 입력 한 배열은 배열의 모든 요소가 특정 유형인지 확인하는 방법을 제공합니다. 이것은 데이터 일관성이 중요한 더 크고 복잡한 응용 프로그램에서 특히 유용 할 수 있습니다. 배열의 모든 요소에 대한 특정 유형을 시행하면 예상치 못한 데이터 유형으로 인해 발생할 수있는 잠재적 버그 및 오류를 방지 할 수 있습니다. 또한 작업중 인 데이터 유형을 항상 알고 있으므로 코드를보다 예측 가능하고 디버깅하기가 더 쉽습니다. PHP에서 엄격하게 입력 한 배열을 어떻게 만들 수 있습니까?

    PHP 엄격하게 입력 한 배열을 기본적으로 지원하지 않습니다. 그러나 배열에 추가 된 요소의 유형 검사를 시행하는 클래스를 만들 수 있습니다. 이 클래스에는 요소를 추가하고 검색하는 방법이 있으며, 이러한 방법은 작업을 수행하기 전에 요소의 유형을 확인합니다. 요소의 유형이 예상 유형과 일치하지 않으면 오류가 발생합니다.

    PHP의 배열과 함께 유형 힌트를 사용할 수 있습니까? 함수 또는 메소드가 함수 또는 메소드 선언의 인수 이름 앞에 "배열"을 추가하여 함수 또는 메소드를 인수로 기대하도록 지정할 수 있습니다. 그러나 이것은 인수가 배열임을 보장하며, 배열의 모든 요소가 특정 유형이 아니라는 것이 아니라. 느슨하게 입력 한 배열과 엄격하게 입력 한 배열의 차이점은 무엇입니까?

    느슨하게 입력 한 배열에서 요소는 모든 유형 일 수 있습니다. 엄격하게 입력 한 배열에서 모든 요소는 특정 유형이어야합니다. 다른 유형의 요소를 엄격하게 입력 한 배열에 다른 유형의 요소를 추가하려고하면 오류가 발생합니다.

    PHP에서 유형 검사를 강요 할 수 있습니까?

    유형 확인을 시행 할 수 있습니다. "deMelare (strict_types = 1);"를 사용하여 PHP PHP 파일의 시작 부분에 지시하십시오. 파일에서 모든 함수 호출 및 반환 명령문을 엄격히 확인하는 경우 PHP에서 엄격하게 입력 된 객체 배열을 만들 수 있습니까? 배열에 추가 된 객체의 유형 확인을 시행하는 클래스를 작성하여 PHP의 객체의 객체. 클래스에는 객체를 추가하고 검색하는 방법이 있으며, 이러한 방법은 작업을 수행하기 전에 물체의 유형을 확인할 것입니다.

    PHP에서 엄격하게 입력 한 배열의 한계는 무엇입니까?

    PHP에서 엄격하게 입력 한 배열의 주요 제한은 PHP가 기본적으로 지원하지 않기 때문에 구현하려면 추가 코드가 필요하다는 것입니다. 이로 인해 코드가 더 복잡하고 유지하기가 더 어려워 질 수 있습니다. 또한, 엄격하게 입력 한 배열은 다른 유형의 요소를 허용하지 않기 때문에 느슨하게 입력 한 배열보다 유연성이 떨어질 수 있습니다.

    PHP에서 다차원 배열과 함께 유형 힌트를 사용할 수 있습니까? PHP의 다차원 배열과 함께 유형 힌트를 사용할 수 있습니다. 그러나 PHP의 유형 힌트는 인수가 배열임을 확인합니다. 배열의 모든 요소 (또는 하위 배열)가 특정 유형이 아니라는 것이 아닙니다. 엄격하게 입력 된 배열을 사용할 때 오류를 처리하는 방법 Php?

    PHP에서 엄격하게 입력 한 배열을 사용하면 Try-Catch 블록을 사용하여 오류를 처리 할 수 ​​있습니다. 배열에 요소를 추가 할 때 오류가 발생하면 (예를 들어, 요소가 잘못된 유형 인 경우) 예외가 발생합니다. 이 예외를 포착하고 적절하게 처리 할 수 ​​있습니다.

    PHP의 내장 어레이 함수와 함께 엄격하게 입력 한 배열을 사용할 수 있습니까?

    예, PHP의 내장 어레이와 함께 엄격하게 입력 한 배열을 사용할 수 있습니다. 기능. 그러나 이러한 기능은 유형 검사를 시행하지 않으므로 조심해야합니다. 배열을 수정하고 잘못된 유형의 요소를 추가하는 함수를 사용하면 오류가 발생할 수 있습니다.

위 내용은 PHP에서 엄격하게 입력 한 배열 및 컬렉션 작성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿