문제

많은 프로그래밍 언어에는 Coalesce 기능이 있습니다 (첫 번째 널 값을 반환합니다. 예시). 슬프게도 2009 년에 PHP는 그렇지 않습니다.

PHP 자체가 Coalesce 기능을 얻을 때까지 PHP에서 하나를 구현하는 좋은 방법은 무엇입니까?

도움이 되었습니까?

해결책

PHP 5.3에는 새로운 운영자가 있습니다. ?:

// A
echo 'A' ?: 'B';

// B
echo '' ?: 'B';

// B
echo false ?: 'B';

// B
echo null ?: 'B';

원천: http://www.php.net/changelog-5.php#5.3.0

다른 팁

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;
}

http://drupial.com/content/php-coalesce

나는 정말로 좋아합니까? : 운영자. 불행히도, 그것은 아직 내 생산 환경에서 구현되지 않았습니다. 그래서 나는 이것과 동등한 것을 사용합니다.

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);
    }));
}

데모: https://eval.in/187365

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top