답변:
첫 번째 인수가 null 인 E_NOTICE
경우, 정의되지 않은 변수가있을 때 null 병합이 a를 출력하지 않는다는 점을 제외하고는 기본적으로 동일 합니다. PHP 7.0 마이그레이션 문서는 이 말을했다 :
null 통합 연산자 (??)는 isset ()과 함께 삼항을 사용해야하는 일반적인 경우에 구문 설탕으로 추가되었습니다. 존재하고 NULL이 아닌 경우 첫 번째 피연산자를 리턴합니다. 그렇지 않으면 두 번째 피연산자를 반환합니다.
이것을 보여주는 예제 코드는 다음과 같습니다.
<?php
$a = null;
print $a ?? 'b'; // b
print "\n";
print $a ?: 'b'; // b
print "\n";
print $c ?? 'a'; // a
print "\n";
print $c ?: 'a'; // Notice: Undefined variable: c in /in/apAIb on line 14
print "\n";
$b = array('a' => null);
print $b['a'] ?? 'd'; // d
print "\n";
print $b['a'] ?: 'd'; // d
print "\n";
print $b['c'] ?? 'e'; // e
print "\n";
print $b['c'] ?: 'e'; // Notice: Undefined index: c in /in/apAIb on line 33
print "\n";
통지가있는 줄은 null 통합 연산자와 달리 짧은 삼항 연산자를 사용하는 줄입니다. 그러나 공지 사항이 있더라도 PHP는 동일한 응답을 다시 제공합니다.
코드를 실행하십시오 : https://3v4l.org/McavC
물론 이것은 항상 첫 번째 인수가이라고 가정합니다 null
. 더 이상 null이 아니면 ??
연산자는 항상 첫 번째 인수를 반환하지만 ?:
단축은 첫 번째 인수가 진실 인 경우에만 PHP가 항목을 부울 형으로 캐스팅 하는 방법에 의존한다는 점에서 차이점이 있습니다.
그래서:
$a = false ?? 'f'; // false
$b = false ?: 'g'; // 'g'
다음 것 $a
같을 수 false
와 $b
같음 'g'
.
$b = []; var_dump($b['a']['b']['c'] ?? 'default');
과 같습니다.$b = new Foo; var_dump($b->a()->b()->c() ?? 'default');
$a = [];
. 참조 : 3v4l.org/iCCa0
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"
??
:??
NULL 만 허용하는 "게이트"와 같습니다 .NULL
. ??
동일하다( !isset() || is_null() )
?:
?:
anything falsy
통과 하는 문과 같습니다.NULL
0
, empty string
, NULL
, false
, !isset()
, empty()
... falsy 냄새 아무것도echo ($x ? $x : false)
?:
던질 것이다 PHP NOTICE
정의되지 않은 (에 unset
또는 !isset()
) 변수??
그리고 ?:
..?:
언제
사용할 것이다empty($x)
검사를!empty($x) ? $x : $y
단축 할 수 있습니다$x ?: $y
if(!$x) { fn($x); } else { fn($y); }
단축 될 수있다 fn(($x ?: $y))
??
언제
사용할 것이다!isset() || is_null()
확인 하고 싶다$object = $object ?? new objClassName();
삼항 연산자를 쌓을 수 있습니다 ...
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 {}
널 Coalese 연산자는 쌓을 수 있습니다 ...
$v = $x ?? $y ?? $z;
이 순서는 다음과 같습니다.
if(!isset($x) || is_null($x) ) {}
else if(!isset($y) || is_null($y) ) {}
else {}
스태킹을 사용하여 이것을 줄일 수 있습니다.
if(!isset($_GET['name'])){
if($user_name){
$name = $user_name;
}else {
$name = 'anonymous';
}
} else {
$name = $_GET['name'];
}
이에:
$name = $_GET['name'] ?? $user_name ?: 'anonymous';
멋지죠? :-)
다음과 같이 바로 가기 삼항 연산자를 사용하면 $_GET['username']
설정되지 않은 경우 알림이 표시됩니다 .
$val = $_GET['username'] ?: 'default';
따라서 대신 다음과 같이해야합니다.
$val = isset($_GET['username']) ? $_GET['username'] : 'default';
널 병합 연산자는 위의 진술에 해당하며, 경우 '기본'을 반환합니다 $_GET['username']
설정되지 않았거나 null
:
$val = $_GET['username'] ?? 'default';
참고 가 truthiness를 확인하지 않습니다 . 설정되어 있고 null이 아닌 경우에만 확인합니다.
이 작업을 수행 할 수도 있으며 첫 번째로 정의 된 (set 및 not null
) 값이 반환됩니다.
$val = $input1 ?? $input2 ?? $input3 ?? 'default';
이제는 적절한 통합 연산자입니다.
가장 큰 차이점은
삼항 연산자 표현식 expr1 ?: expr3
은 평가
되지만 리턴되는 expr1
경우 Null Coalescing Operator 표현식 은 그렇지 않은 경우
평가expr1
TRUE
(expr1) ?? (expr2)
expr1
expr1
NULL
삼항 연산자는 expr1 ?: expr3
왼쪽 값이 경우 통지를 방출 (expr1)
은 존재하지 않고 반면에 널 합체 운영자 (expr1) ?? (expr2)
왼쪽 값이 경우 특히, 통지를 방출하지 않는 (expr1)
것처럼 존재하지 않습니다 isset()
.
TernaryOperator 가 연관되어 있습니다.
((true ? 'true' : false) ? 't' : 'f');
Null Coalescing Operator 는 올바른 연관성입니다.
($a ?? ($b ?? $c));
이제 예를 들어 다음과 같은 차이점을 설명하겠습니다.
삼항 연산자 (?:)
$x='';
$value=($x)?:'default';
var_dump($value);
// The above is identical to this if/else statement
if($x){
$value=$x;
}
else{
$value='default';
}
var_dump($value);
널 병합 연산자 (??)
$value=($x)??'default';
var_dump($value);
// The above is identical to this if/else statement
if(isset($x)){
$value=$x;
}
else{
$value='default';
}
var_dump($value);
여기에서의 차이점과 유사성 설명 표이다 '??'
및?:
특별 참고 사항 : null 병합 연산자 및 삼항 연산자는 표현식이며 변수로 평가되지 않지만 표현식의 결과로 평가됩니다. 참조로 변수를 반환하려면 알고 있어야합니다. 문장은 $ foo를 반환 ?? $ bar; $ var == 42를 반환합니까? $ a : $ b; 따라서 참조 별 리턴 기능에서 작동하지 않으며 경고가 발행됩니다.
동적 데이터 처리와 관련하여 둘 다 다르게 작동합니다.
변수가 비어 있으면 ( '') null 병합은 변수를 true로 취급하지만 단축 삼항 연산자는 그렇지 않습니다. 그리고 그것은 염두에 두어야 할 것입니다.
$a = NULL;
$c = '';
print $a ?? '1b';
print "\n";
print $a ?: '2b';
print "\n";
print $c ?? '1d';
print "\n";
print $c ?: '2d';
print "\n";
print $e ?? '1f';
print "\n";
print $e ?: '2f';
그리고 출력 :
1b
2b
2d
1f
Notice: Undefined variable: e in /in/ZBAa1 on line 21
2f
It returns its first operand if it exists and is not NULL; otherwise it returns its second operand
.
초보자를위한 :
Null 통합 연산자 (??)
null
값과 정의되지 않은 것 (변수 / 배열 인덱스 / 객체 속성)을 제외한 모든 것이 사실입니다.
전의:
$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"
이것은 기본적으로 변수 (배열 색인, 객체 속성 등)가 존재하지 않는지 확인 null
합니다. isset
기능 과 유사
삼항 연산자 속기 (? :)
모든 잘못된 일들이 ( false
, null
, 0
, 빈 문자열) 허위로 제공되지만, 그것은이 정의되지 않은 경우는 거짓으로 올하지만 Notice
발생합니다
전의
$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: ..
도움이 되었기를 바랍니다
이 링크를 아래로 스크롤 하여 섹션을 보면 아래에 표시된 비교 예가 표시됩니다.
<?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 ()과 함께 삼항을 사용해야하는 일반적인 경우에 구문 설탕으로 추가되었습니다. 존재하고 NULL이 아닌 경우 첫 번째 피연산자를 리턴합니다. 그렇지 않으면 두 번째 피연산자를 반환합니다.
기본적으로 통합 연산자를 사용하면 삼항 연산자와 달리 null을 자동으로 확인하게됩니다.
a || b || c
부울에 사용할 수있는 PHP를 제외하고 JS 의 일반적인 패턴 과 매우 유사합니다 ( false || 2
JS는 2, false ?? 2
PHP는 false)
다른 답변은 깊이 들어가서 훌륭한 설명을 제공합니다. 빠른 답변을 원하는 사람들에게는
$a ?: 'fallback'
이다 $a ? $a : 'fallback'
동안
$a ?? 'fallback'
이다 $a = isset($a) ? $a : 'fallback'
가장 큰 차이점은 왼쪽 연산자가 다음 중 하나 일 때입니다.
0
, ''
, false
, []
, ...)$a =
위의 확장 에는 없어야합니다 ??
. $ a의 값을 설정하거나 변경 $a ?? 'fallback'
하지 않습니다 . (단지 값을 반환합니다).
이 중 하나를 사용하는 장점과 단점이 있습니다 것 ??
또는 ?:
. 사용하는 전문가 ?:
는 false와 null을 평가하고 ""를 동일하게 평가한다는 것입니다. 앞의 인수가 널이면 E_NOTICE를보고한다는 것이 단점입니다. 로 ??
프로 더 E_NOTICE가 없다는 것입니다,하지만 죄수는 같은 거짓과 null을 평가하지 않습니다. 내 경험상 사람들이 null과 false를 상호 교환 가능하게 사용하기 시작했지만 결국 null 또는 false를 사용하도록 코드를 수정하는 데 의존하지만 둘 다 사용하지는 않습니다. 대안은보다 정교한 삼항 조건을 만드는 것 (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";
이 구문은 null, false 및 ""를 동일하게 평가하며 E_NOTICE를 발생시키지 않습니다.
?? 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
수행 단 두 가지 작업 : 그것은 검사 whether the variable is set
와 whether it is null
. 다음 예제를 살펴보십시오.
<?php
# case 1:
$greeting = 'Hola';
echo $greeting ?? 'Hi There'; # outputs: 'Hola'
# case 2:
$greeting = null;
echo $greeting ?? 'Hi There'; # outputs: 'Hi There'
# case 3:
unset($greeting);
echo $greeting ?? 'Hi There'; # outputs: 'Hi There'
위의 코드 예제에서는 Null Coalescing operator
존재하지 않는 변수와 NULL
같은 방식으로 설정된 변수를 처리합니다 .
Null Coalescing operator
에 대한 개선 ternary operator
입니다. 두 코드를 비교하는 다음 코드 스 니펫을 살펴보십시오.
<?php /* example: checking for the $_POST field that goes by the name of 'fullname'*/
# in ternary operator
echo "Welcome ", (isset($_POST['fullname']) && !is_null($_POST['fullname']) ? $_POST['fullname'] : 'Mr. Whosoever.'); # outputs: Welcome Mr. Whosoever.
# in null coalecing operator
echo "Welcome ", ($_POST['fullname'] ?? 'Mr. Whosoever.'); # outputs: Welcome Mr. Whosoever.
따라서이 둘의 차이점은 Null Coalescing operator
연산자가 정의되지 않은 변수를보다 잘 처리하도록 설계 되었다는 것 ternary operator
입니다. 반면에는의 ternary operator
약어입니다 if-else
.
Null Coalescing operator
를 대체하기위한 것이 ternary operator
아니라 위 예제와 같은 일부 사용 사례에서는 번거 로움없이 깔끔한 코드를 작성할 수 있습니다.
크레딧 : http://dwellupper.io/post/6/php7-null-coalescing-operator-usage-and-examples
isset($_POST['fullname'])
이미 대한 검사 NULL
값 - 그렇게 && !is_null($_POST['fullname'])
첫 번째 예에서 중복 어쨌든입니다
$ _GET 또는 $ _REQUEST와 같은 슈퍼 글로벌을 사용하는 경우 빈 문자열 일 수 있음을 알고 있어야합니다. 이 specal 경우이 예제는
$username = $_GET['user'] ?? 'nobody';
$ username의 값이 이제 빈 문자열이므로 실패합니다.
따라서 $ _GET 또는 $ _REQUEST를 사용할 때는 다음과 같이 삼항 연산자를 사용해야합니다.
$username = (!empty($_GET['user'])?$_GET['user']:'nobody';
이제 $ username의 값은 'nobody'입니다.