2017-12-06 6 views
0

C# 배경을 가지고 있으므로 클래스 속성을 처리 할 때 (엔터티 프레임 워크 관계를 사용할 때) 항상 ?. 연산자를 사용합니다.null 조건부 연산자는 항상 첫 번째 null 발생을 중단합니까?

예를 들어이 클래스를 사용하고 상태 클래스가 null 인 경우 null 객체에서 속성을 가져 오는 중이므로 예외가 발생합니다. 이 같은

var order = DB.Order.Find(1); 

var status = order.status.text; 

이 문제를 해결하려면, 내가 할 수있는 일 :

var address = order.status?.text ?? "No status"; 

?. 운영자가 처음 널에 휴식과 acessings의 나머지를 건너 뜁니다.

나는 PHP에서 같은 상황을 가로 질러 와서 이런 일을 수행했다 : (null 객체에서 속성을 얻으려고 노력의 상태가 비어있는 경우

$order = Orders::find(1); 
$status = $order->status->text; 

,이 같은 예외를 던질거야을).

그러나 나는 이런 짓을하고 일했다 :

$status = $order->status->text ?? "No status"; 

분명히, PHP는 status가 null의 경우 acessing ->text을 생략한다.

나는 created a fiddle 이것이 내 환경에만 있는지 아닌지를 확인하고 놀라 울 정도로 잘 작동합니다!

<?php 
$j = "Hello!"; 
echo $a->b->c->d->e ?? $a->b->c->d ?? $a->b->c ?? $a->b ?? $j; 

< < "안녕하세요!"

이것은 PHP에서 ?? 연산자의 예상되는 동작입니까? 내가 didn't이 문서에 언급 된 참조하십시오.

답변

0

약간의 연구 끝에 PHP 7에 추가 된 null 조건부 연산자 (??)가 기본적으로 isset()의 구문 설탕 인 것처럼 3 진 호출에서 사용되는 것으로 나타났습니다. 변수가 null의 경우

<?php 

$a = array ('test' => 1, 'hello' => NULL, 'pie' => array('a' => 'apple')); 

// Checking deeper array values 
var_dump(isset($a['pie']['a']));  // TRUE 
var_dump(isset($a['pie']['b']));  // FALSE 
var_dump(isset($a['cake']['a']['b'])); // FALSE 

?> 

isset() 기능은, 그것을 E_NOTICE 그냥 던져하지 않습니다

echo isset($a->b->c) ? $a->b->c : "Hello!"; 

는 isset 함수의 문서는 깊은 배열 값에 액세스하는 시도의 명확한 예를 보여줍니다 나머지 acessing은 건너 뜁니다. null coalesce 연산자는 기본적으로 isset()을 내부적으로 사용하기 때문에 null 객체의 속성에 액세스하려고 할 때 예외를 throw하지 않습니다.

Here is the link 구현 제안 사항에는이 연산자의 소스 코드가 포함 된 병합 요청에 대한 링크가 포함되어 있습니다.

+0

내부적으로 isset을 사용한다는 진술에 대해서는 잘못 될 수 있지만 구현은 동일합니다. – Phiter