매일 PHP 개발에서 우리는 종종 배열이나 물체를 가로 질러야합니다. 그러나 PHP의 동적 유형 특성으로 인해 들어오는 변수가 셀 수있는 상태를 보장 할 수는 없습니다 (즉, 계산 가능한 인터페이스 또는 어레이를 구현). 카운트가없는 변수에서 직접 COUNT ()를 사용하거나 Foreach Traversal을 수행하는 경우, 특히 불안정한 외부 데이터를 처리 할 때 오류 또는 경고가 발생할 수 있습니다.
이 문제를 해결하기 위해 PHP 7.3은 is_countable () 함수를 도입했으며, 이는 카운트 ()을 호출하기 전에 변수를 계산할 수 있는지 여부를 결정하는 데 사용됩니다. 이것은 코드의 견고성과 결함 허용을 크게 향상시킵니다.
is_countable ()은 PHP 7.3+에서 제공하는 내장 함수이며, 변수를 count () 함수로 전달할 수 있는지 여부를 결정하는 데 사용됩니다. 기능 프로토 타입은 다음과 같습니다.
<span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">is_countable</span></span><span>(</span><span><span class="hljs-keyword">mixed</span></span><span> </span><span><span class="hljs-variable">$value</span></span><span>)
</span></span>
반환 값은 부울 값입니다. 변수가 배열이거나 Countable 인터페이스가 구현되면 true를 반환합니다. 그렇지 않으면 false를 반환합니다.
외부 API에서 데이터 세트를 얻고이를 통과한다고 가정 해 봅시다.
<span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">get_data_from_api</span></span><span>();
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$data</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$item</span></span><span>) {
</span><span><span class="hljs-comment">// 각 항목을 처리하십시오</span></span><span>
}
</span></span>
이상적으로는 $ 데이터 는 배열 또는 반복 가능한 객체입니다. 그러나 API가 NULL , String 또는 Boolean을 반환하면 위의 코드에 경고 또는 오류가 발생합니다.
이를 피하기 위해 IS_COUNTABLE ()를 사용하여 이동하기 전에 판단 할 수 있습니다.
<span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">get_data_from_api</span></span><span>();
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">is_countable</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>)) {
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$data</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$item</span></span><span>) {
</span><span><span class="hljs-comment">// 安全地각 항목을 처리하십시오</span></span><span>
}
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-comment">// 선택 과목:로그 또는 프로세스 기본 동작</span></span><span>
</span><span><span class="hljs-title function_ invoke__">error_log</span></span><span>(</span><span><span class="hljs-string">"수신 할 수없는 데이터 유형。"</span></span><span>);
}
</span></span>
이런 식으로, 반환 된 null , 정수 또는 기타 사소 할 수없는 유형이 있더라도 프로그램은 충돌하지 않으므로 시스템의 견고성을 향상시킵니다.
많은 개발자들이 PHP 7.3 전에 IS_ARRAY ()를 사용하여 계산할 수 있는지 여부를 결정합니다. 이것은 많은 시나리오에서 가능하지만 Countable 인터페이스를 구현하는 객체를 식별하지는 않습니다. 예를 들어:
<span><span><span class="hljs-class"><span class="hljs-keyword">class</span></span></span><span> </span><span><span class="hljs-title">MyCollection</span></span><span> </span><span><span class="hljs-keyword">implements</span></span><span> </span><span><span class="hljs-title">Countable</span></span><span> {
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">count</span></span><span>(</span><span><span class="hljs-params"></span></span><span>): </span><span><span class="hljs-title">int</span></span><span> {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-number">0</span></span><span>;
}
}
</span><span><span class="hljs-variable">$collection</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">MyCollection</span></span><span>();
</span></span>
현재 :
<span><span><span class="hljs-title function_ invoke__">is_array</span></span><span>(</span><span><span class="hljs-variable">$collection</span></span><span>); </span><span><span class="hljs-comment">// false</span></span><span>
</span><span><span class="hljs-title function_ invoke__">is_countable</span></span><span>(</span><span><span class="hljs-variable">$collection</span></span><span>); </span><span><span class="hljs-comment">// true</span></span><span>
</span></span>
따라서 최신 PHP에서 is_array () + count () comminatorial logic 대신 iS_Countable ()을 사용해야합니다.
유형 확인은 외부 입력에서 수행됩니다 . 특히 데이터베이스 쿼리 및 비어있을 수있는 API 응답과 같은 구조.
통합 캡슐화 판단 논리 : is_countable () 점검은 코드를 깔끔하게 유지하기위한 일반적인 도구 기능으로 캡슐화 할 수 있습니다.
유형 프롬프트와 정적 분석 도구를 결합하면 PHPSTAN 또는 PSALM과 같은 정적 분석 도구는 알려지지 않은 유형의 위험을 더욱 줄일 수 있습니다.
is_countable ()은 불확실한 데이터 구조를 다룰 때 더 편안하게 할 수있는 작고 강력한 도구입니다. 이 기능을 잘 활용하면 런타임 오류를 피할 수있을뿐만 아니라보다 강력하고 관리하기 쉬운 PHP 응용 프로그램을 작성할 수 있습니다.