PHP의 기능을 합산합니까?
-
06-07-2019 - |
문제
많은 프로그래밍 언어에는 Coalesce 기능이 있습니다 (첫 번째 널 값을 반환합니다. 예시). 슬프게도 2009 년에 PHP는 그렇지 않습니다.
PHP 자체가 Coalesce 기능을 얻을 때까지 PHP에서 하나를 구현하는 좋은 방법은 무엇입니까?
해결책
PHP 5.3에는 새로운 운영자가 있습니다. ?:
// A
echo 'A' ?: 'B';
// B
echo '' ?: 'B';
// B
echo false ?: 'B';
// B
echo null ?: 'B';
다른 팁
PHP 7은 실제를 소개했습니다 연합 운영자:
echo $_GET['doesNotExist'] ?? 'fallback'; // prints 'fallback'
이전의 값이 있다면 ??
존재하지 않거나 그렇지 않습니다 null
이후의 가치 ??
촬영됩니다.
언급 된 것보다 개선 ?:
운영자는입니다 ??
또한 an을 던지지 않고 정의되지 않은 변수를 처리합니다 E_NOTICE
.
Google에서 "PHP Coalesce"에 대한 첫 번째 타격.
function coalesce() {
$args = func_get_args();
foreach ($args as $arg) {
if (!empty($arg)) {
return $arg;
}
}
return NULL;
}
나는 정말로 좋아합니까? : 운영자. 불행히도, 그것은 아직 내 생산 환경에서 구현되지 않았습니다. 그래서 나는 이것과 동등한 것을 사용합니다.
function coalesce() {
return array_shift(array_filter(func_get_args()));
}
PHP의 초기화되지 않은 변수 및 어레이 지수에 대한 처리로 인해 모든 종류의 Coalesce 기능은 제한적으로 사용된다는 점에 주목할 가치가 있습니다. 나는 이것을 할 수 있기를 원한다 :
$id = coalesce($_GET['id'], $_SESSION['id'], null);
그러나 이것은 대부분의 경우 E_Notice로 PHP가 오류를 일으킬 것입니다. 변수를 사용하기 전에 존재하는 유일한 안전한 방법은 빈 () 또는 isset ()에서 직접 사용하는 것입니다. Coalesce의 모든 옵션이 초기화되는 것으로 알려져 있음을 알고 있다면 Kevin이 제안한 Ternary 운영자가 최선의 선택입니다.
이 기능이 특정 유형에서 작동하는 방법을 정확하게 식별해야합니다. PHP는 다양한 유형 검사 또는 유사한 기능을 가지고 있으므로 어떻게 작동하는지 알아야합니다. 이것은 is_null () 및 empty ()의 예제입니다.
$testData = array(
'FALSE' => FALSE
,'0' => 0
,'"0"' => "0"
,'NULL' => NULL
,'array()'=> array()
,'new stdClass()' => new stdClass()
,'$undef' => $undef
);
foreach ( $testData as $key => $var )
{
echo "$key " . (( empty( $var ) ) ? 'is' : 'is not') . " empty<br>";
echo "$key " . (( is_null( $var ) ) ? 'is' : 'is not') . " null<br>";
echo '<hr>';
}
보시다시피, 빈 ()는이 모든 것에 대해 true를 반환하지만 is_null ()은 그 중 2 개만 그렇게합니다.
게시 된 답변을 확장하고 있습니다 에단 켄트. 그 대답은 내부 작업으로 인해 거짓으로 평가되는 비 널 주장을 폐기합니다. Array_Filter, 그것은 무엇이 아닙니다 coalesce
기능은 일반적으로합니다. 예를 들어:
echo 42 === coalesce(null, 0, 42) ? 'Oops' : 'Hooray';
죄송합니다
이를 극복하려면 두 번째 인수와 기능 정의가 필요합니다. 그만큼 호출 가능 기능은 말할 책임이 있습니다 array_filter
결과 배열에 현재 배열 값을 추가할지 여부 :
// "callable"
function not_null($i){
return !is_null($i); // strictly non-null, 'isset' possibly not as much
}
function coalesce(){
// pass callable to array_filter
return array_shift(array_filter(func_get_args(), 'not_null'));
}
단순히 통과 할 수 있다면 좋을 것입니다 isset
또는 'isset'
두 번째 논쟁으로 array_filter
, 그러나 그런 행운은 없습니다.
현재 이것을 사용하고 있지만 PHP 5의 일부 새로운 기능으로 개선 할 수 없는지 궁금합니다.
function coalesce() {
$args = func_get_args();
foreach ($args as $arg) {
if (!empty($arg)) {
return $arg;
}
}
return $args[0];
}
PHP 5.3+, 폐쇄 :
function coalesce()
{
return array_shift(array_filter(func_get_args(), function ($value) {
return !is_null($value);
}));
}