php - 프로그램 - 비트연산자 활용




PHP 삼항 연산자 대 null 병합 연산자 (9)

$ _GET 또는 $ _REQUEST와 같은 슈퍼 글로벌을 사용하는 경우 빈 문자열 일 수 있음을 알고 있어야합니다. 이 specal 경우이 예제는

$username = $_GET['user'] ?? 'nobody';

$ username의 값이 이제 빈 문자열이므로 실패합니다.

따라서 $ _GET 또는 $ _REQUEST를 사용할 때는 다음과 같이 삼항 연산자를 사용해야합니다.

$username = (!empty($_GET['user'])?$_GET['user']:'nobody';

이제 $ username의 값은 'nobody'입니다.

PHP에서 삼항 연산자 속기 ( ?: :)와 null 병합 연산자 ( ?? )의 차이점을 누군가가 설명 할 수 있습니까?

그것들은 언제 다르게 행동하고 언제 똑같은 방식으로 (그런 경우에도)?

$a ?: $b

VS.

$a ?? $b

PHP 대화식 모드에서 터미널을 실행하십시오 (터미널에서 php -a ). 각 줄의 주석은 결과를 보여줍니다.

var_dump (false ?? 'value2');   # bool(false)
var_dump (true  ?? 'value2');   # bool(true)
var_dump (null  ?? 'value2');   # string(6) "value2"
var_dump (''    ?? 'value2');   # string(0) ""
var_dump (0     ?? 'value2');   # int(0)

var_dump (false ?: 'value2');   # string(6) "value2"
var_dump (true  ?: 'value2');   # bool(true)
var_dump (null  ?: 'value2');   # string(6) "value2"
var_dump (''    ?: 'value2');   # string(6) "value2"
var_dump (0     ?: 'value2');   # string(6) "value2"

그래서 이것은 나의 해석입니다.

1. 널 병합 연산자- ?? :

  • ?? NULL 만 허용하는 "게이트"와 같습니다 .
  • 따라서 첫 번째 매개 변수가 NULL 아닌 한 항상 첫 번째 매개 변수를 반환 NULL .
  • 이것은 의미 ?? ( !isset() || is_null() )

삼항 연산자- ?:

  • ?: NULL 포함하여 anything falsy 통과시키는 게이트와 같습니다.
  • 0 , empty string , NULL , false ,! !isset() , empty() .. false 냄새가 나는 것
  • 전형적인 삼항 연산자처럼 : echo ($x ? $x : false)
  • 참고 : ?: 정의되지 않은 ( unset 또는 !isset() ) 변수에 대해 PHP NOTICE 가 발생합니다.

3. 그래서 의사, 언제 사용합니까 ?? 그리고 ?: ..

  • 나는 농담 만 해요-나는 의사가 아니며 이것은 단지 해석 일뿐입니다
  • 나는 ?: 사용할 것이다 ?: 언제
    • empty($x) 점검
    • !empty($x) ? $x : $y 같은 클래식 삼항 연산 !empty($x) ? $x : $y !empty($x) ? $x : $y$x ?: $y 로 단축 할 수 $x ?: $y
    • if(!$x) { fn($x); } else { fn($y); } if(!$x) { fn($x); } else { fn($y); }fn(($x ?: $y)) 로 단축 될 수 있습니다
  • 나는 사용할 것이다 ?? 언제
    • !isset() || is_null() 하고 싶습니다 !isset() || is_null() !isset() || is_null() 확인
    • 예를 들어 객체가 존재하는지 확인- $object = $object ?? new objClassName(); $object = $object ?? new objClassName();

4. 스태킹 연산자 ...

  1. 삼항 연산자를 쌓을 수 있습니다 ...

    echo 0 ?: 1 ?: 2 ?: 3; //1
    echo 1 ?: 0 ?: 3 ?: 2; //1
    echo 2 ?: 1 ?: 0 ?: 3; //2
    echo 3 ?: 2 ?: 1 ?: 0; //3
    
    echo 0 ?: 1 ?: 2 ?: 3; //1
    echo 0 ?: 0 ?: 2 ?: 3; //2
    echo 0 ?: 0 ?: 0 ?: 3; //3

    이 코드의 소스 및 크레딧

    이것은 기본적으로 다음 순서입니다.

    if( truthy ) {}
    else if(truthy ) {}
    else if(truthy ) {}
    ..
    else {}
  2. 널 Coalese 연산자는 쌓을 수 있습니다 ...

    $v = $x ?? $y ?? $z; 

    이 순서는 다음과 같습니다.

    if(!isset($x) || is_null($x) ) {} 
    else if(!isset($y) || is_null($y) ) {}
    else {}
  3. 스태킹을 사용하여 이것을 줄일 수 있습니다.

    if(!isset($_GET['name'])){
       if(isset($user_name) && !empty($user_name)){
          $name = $user_name;
       }else {
          $name = 'anonymous';
       }
    } else { 
       $name = $_GET['name'];
    }

    이에:

    $name = $_GET['name'] ?? $user_name ?: 'anonymous';

    멋지죠? :-)


다른 답변은 깊이 들어가서 훌륭한 설명을 제공합니다. 빠른 답변을 원하는 사람들에게는

$a ?: 'fallback'$a ? $a : 'fallback' $a ? $a : 'fallback'

동안

$a ?? 'fallback' $a ?? 'fallback'$a = isset($a) ? $a : 'fallback' $a = isset($a) ? $a : 'fallback'

가장 큰 차이점은 왼쪽 연산자가 다음 중 하나 일 때입니다.

  • 널이 아닌 허위 값 ( 0 , '' , false , [] , ...)
  • 정의되지 않은 변수

다음과 같이 바로 가기 삼항 연산자를 사용하면 $_GET['username'] 이 설정되지 않은 경우 알림이 표시됩니다.

$val = $_GET['username'] ?: 'default';

따라서 대신 다음과 같이해야합니다.

$val = isset($_GET['username']) ? $_GET['username'] : 'default';

null 병합 연산자 는 위의 명령문과 동일하며 $_GET['username'] 이 설정되어 있지 않거나 null 경우 'default'를 반환합니다.

$val = $_GET['username'] ?? 'default';

진실성을 확인하지는 않습니다 . 설정되어 있고 null이 아닌 경우에만 확인합니다.

이 작업을 수행 할 수도 있으며 첫 번째로 정의 된 (set 및 not null ) 값이 반환됩니다.

$val = $input1 ?? $input2 ?? $input3 ?? 'default';

이제는 적절한 통합 연산자입니다.


둘 다 더 긴 표현을위한 속기입니다.

?: $a ? $a : $b 는 짧 $a ? $a : $b $a ? $a : $b . $ a가 TRUE 로 평가되면이 표현식은 $ a로 평가됩니다.

?? isset($a) ? $a : $b 약자 isset($a) ? $a : $b isset($a) ? $a : $b . $ a가 설정되고 널이 아닌 경우이 표현식은 $ a로 평가됩니다.

$ a가 정의되지 않았거나 null 인 경우 사용 사례가 겹칩니다. $ a가 정의되지 않은 경우 ?? E_NOTICE를 생성하지 않지만 결과는 동일합니다. $ a가 null이면 결과는 같습니다.


어느 쪽을 사용하든 장단점이있는 것 같습니다 ?? 또는 ?: . ?: 를 사용하는 전문가는 false와 null을 평가하고 ""를 동일하게 평가한다는 것입니다. 앞의 인수가 널이면 E_NOTICE를보고한다는 것이 단점입니다. 와 ?? 장점은 E_NOTICE가 없다는 것입니다. 그러나 단점은 거짓을 평가하지 않고 동일하지 않다는 것입니다. 내 경험상 사람들이 null과 false를 상호 교환 가능하게 사용하기 시작했지만 결국 null 또는 false를 사용하도록 코드를 수정하는 데 의존하지만 둘 다 사용하지는 않습니다. 대안은보다 정교한 삼항 조건을 만드는 것입니다 : (isset($something) or !$something) ? $something : $something_else (isset($something) or !$something) ? $something : $something_else .

다음은 ?? 를 사용하는 차이점의 예입니다 ?? null과 false를 모두 사용하는 연산자 :

$false = null;
$var = $false ?? "true";
echo $var . "---<br>";//returns: true---

$false = false;
$var = $false ?? "true";
echo $var . "---<br>"; //returns: ---

그러나 삼항 연산자를 정교화함으로써 e_notice를 던지지 않고 널 (null) 인 것처럼 거짓 또는 빈 문자열 ""을 만들 수 있습니다.

$false = null;
$var = (isset($false) or !$false) ? $false : "true";
echo $var . "---<br>";//returns: ---

$false = false;
$var = (isset($false) or !$false) ? $false : "true";
echo $var . "---<br>";//returns: ---

$false = "";
$var = (isset($false) or !$false) ? $false : "true";
echo $var . "---<br>";//returns: ---

$false = true;
$var = (isset($false) or !$false) ? $false : "true";
echo $var . "---<br>";//returns: 1---

개인적으로, PHP의 향후 개정판에 다른 새로운 연산자가 포함되어 있다면 정말 좋을 것 같습니다 :? 위의 구문을 대체했습니다. 즉 : // $var = $false :? "true"; // $var = $false :? "true"; 이 구문은 null, false 및 ""를 동일하게 평가하며 E_NOTICE를 발생시키지 않습니다 ...


초보자를위한 :

Null 통합 연산자 (??)

null 값과 정의되지 않은 (변수 / 배열 색인 / 객체 속성)을 제외한 모든 것이 참입니다.

전의:

<?php
/** Fetches the value of $_GET['user'] and returns 'nobody' if it does not exist. **/
$username = $_GET['user'] ?? 'nobody';
/** This is equivalent to: **/
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

/** Coalescing can be chained: this will return the first defined value out of $_GET['user'], $_POST['user'], and 'nobody'. **/
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';
?>

이것은 기본적으로 변수 (배열 색인, 객체 속성 등)가 존재하고 null 아닌지 확인합니다. isset 함수와 유사

삼항 연산자 속기 (? :)

모든 잘못된 것 ( false , null , 0 , 빈 문자열)은 false로 표시되지만 정의되지 않은 경우 false로 표시되지만 Notice 는 발생합니다.

전의

$array = [];
$object = new stdClass();

var_export (false ?? 'second');                           # false
var_export (true  ?? 'second');                           # true
var_export (null  ?? 'second');                           # 'second'
var_export (''    ?? 'second');                           # ""
var_export ('some text'    ?? 'second');                  # "some text"
var_export (0     ?? 'second');                           # 0
var_export ($undefinedVarible ?? 'second');               # "second"
var_export ($array['undefined_index'] ?? 'second');       # "second"
var_export ($object->undefinedAttribute ?? 'second');     # "second"

도움이 되었기를 바랍니다


this 링크를 아래로 스크롤하여 섹션을 보면 아래에 표시된 비교 예가 표시됩니다.

$array = [];
$object = new stdClass();

var_export (false ?: 'second');                           # "second"
var_export (true  ?: 'second');                           # true
var_export (null  ?: 'second');                           # "second"
var_export (''    ?: 'second');                           # "second"
var_export ('some text'    ?? 'second');                  # "some text"
var_export (0     ?: 'second');                           # "second"
var_export ($undefinedVarible ?: 'second');               # "second" Notice: Undefined variable: ..
var_export ($array['undefined_index'] ?: 'second');       # "second" Notice: Undefined index: ..
var_export ($object->undefinedAttribute ?: 'second');     # "Notice: Undefined index: ..

그러나 나중에 읽을 때 코드를 이해하기 어렵게하기 때문에 연산자를 연결하는 것은 좋지 않습니다.

null 통합 연산자 (??)는 isset ()과 함께 삼항을 사용해야하는 일반적인 경우에 구문 설탕으로 추가되었습니다. 존재하고 NULL이 아닌 경우 첫 번째 피연산자를 리턴합니다. 그렇지 않으면 두 번째 피연산자를 반환합니다.

기본적으로 통합 연산자를 사용하면 삼항 연산자와 달리 null을 자동으로 확인하게됩니다.


class a
{
    public $a = 'aaa';
}

$a = new a();

echo $a->a;  // Writes 'aaa'
echo $a->b;  // Notice: Undefined property: a::$b

echo $a->a ?? '$a->a does not exists';  // Writes 'aaa'

// Does not throw an error although $a->b does not exist.
echo $a->b ?? '$a->b does not exist.';  // Writes $a->b does not exist.

// Does not throw an error although $a->b and also $a->b->c does not exist.
echo $a->b->c ?? '$a->b->c does not exist.';  // Writes $a->b->c does not exist.




null-coalescing-operator