[php] PHP를위한 통합 함수?

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

PHP 자체가 통합 기능을 얻을 때까지 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이 후 값을 ??가져옵니다.

언급 된 ?:연산자에 비해 개선 된 점은 ??을 던지지 않고 정의되지 않은 변수도 처리한다는 것 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가 초기화되지 않은 변수와 배열 인덱스를 처리했기 때문에 모든 종류의 병합 함수는 제한적으로 사용됩니다. 나는 이것을 할 수 있기를 바랍니다.

$id = coalesce($_GET['id'], $_SESSION['id'], null);

그러나 이것은 대부분의 경우 PHP가 E_NOTICE와 함께 오류를 발생시킵니다. 변수를 사용하기 전에 변수의 존재를 테스트하는 유일한 안전한 방법은 empty () 또는 isset ()에서 직접 사용하는 것입니다. 통합의 모든 옵션이 초기화 된 것으로 알려진 경우 Kevin이 제안한 3 항 연산자가 가장 좋습니다.


답변

이 기능이 특정 유형에서 작동하는 방식을 정확하게 식별하십시오. 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>';
}

보시다시피 empty ()는이 모든 것에 대해 true를 반환하지만 is_null ()은 그 중 2에 대해서만 true를 반환합니다.


답변

Ethan Kent가 게시 한 답변을 확장하고 있습니다. 이 답변은 array_filter 의 내부 작업으로 인해 null로 평가되는 null이 아닌 인수를 삭제 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좋지만 그러한 행운은 없습니다.