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で同じような状況に出くわしたし、このような何かしなければならなかった:ステータスが空の場合

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

を、それがnullのオブジェクトのうちのプロパティを取得しようとしている(同じ例外がスローされます)。

しかし、私はこれをしなかったし、それが働いた:

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

どうやら、PHPはstatusがnullの場合はアクセスしてる->textを飛ばしています。

私はcreated a fiddleこれが私の環境だけではないかどうかを確認するのは驚くべきことですが、うまくいきました。

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

< < "こんにちは!"

これは実際にPHPの??オペレータの期待される動作ですか?私はこれがドキュメントで言及されていなかったので。

答えて

0

いくつかの調査の結果、PHP 7で追加されたnull条件付き演算子(??)は、基本的には、それが3進呼び出しで使用されたかのようにisset()の構文糖であることがわかりました。

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

ISSET機能のドキュメントが深い配列の値にアクセスしようとするとの明確な例を示します。

<?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 

?> 

変数がnullのときisset()機能は、単に、それをE_NOTICEをスローしません残りの処理をスキップします。 null合体演算子は基本的にisset()を内部的に使用するため、nullオブジェクトのプロパティにアクセスしようとすると例外がスローされません。

Here is the link実装の提案には、この演算子のソースコードを含むマージ要求へのリンクが含まれています。

+0

私はissetを内部的に使用しているという記述について間違っているかもしれませんが、実装はおそらく同じです。 – Phiter