(jp) =
PHP のいくつかの比較演算子は、おそらく既にご存知でしょう。 三項のようなもの ?:
、ヌル合体 ??
そして宇宙船 operators.
But do you really know how they work?
Understanding these operators makes you use them more, resulting in a cleaner codebase.
Before looking at each operator in depth, here’s a summary of what each of them does:
# Ternary operator
The ternary operator is a shorthand for the if else
構造。 これを書く代わりに:
if ($condition)
$result = 'foo'
else
$result = 'bar'
これを書くことができます:
$result = $condition ? 'foo' : 'bar';
これなら $condition
に評価されます true
、左側のオペランドが割り当てられます $result
. 条件が次のように評価される場合 false
、右手が使用されます。
興味深い事実: 名前 三項演算子 実際には「3 つのオペランドに作用する演算子」を意味します。 アン オペランド 式に必要な部分を示すために使用される用語です。 三項演算子は、3 つのオペランド (条件、 true
そしてその false
結果。 同様に、二項演算子と単項演算子もあります。 詳細については、こちらをご覧ください。
三項演算子に戻る: どの式が評価されるか知っていますか? true
、そしてどれがそうではありませんか? を見てください boolean
この表の列。
条件が次のように評価されると、三項演算子は左側のオペランドを使用します。 true
. これは、文字列、整数、ブール値などです。右側のオペランドは、いわゆる「偽値」に使用されます。
例は 0
また '0'
、空の配列または文字列、 null
、未定義または未割り当ての変数、そしてもちろん false
自体。 これらすべての値により、三項演算子は右側のオペランドを使用します。
# 三項演算子の短縮形
PHP 5.3 以降、左側のオペランドを省略して、さらに短い式を使用できるようになりました。
$result = $initial ?: 'default';
この場合、値 $result
の値になります $initial
、 そうでもなければ $initial
に評価されます false
、この場合は文字列 'default'
使用されている。
この式は、通常の三項演算子を使用して同じ方法で記述できます。
$result = $condition ? $condition : 'default';
皮肉なことに、三項演算子の第 2 オペランドを省略すると、実際には 二項演算子.
# 三項演算子の連鎖
論理的に見えますが、次のとおりです。 PHP では動作しません:
$result = $firstCondition
? 'truth'
: $elseCondition
? 'elseTrue'
: 'elseFalse';
その理由は、PHP の三項演算子が左結合であるため、非常に奇妙な方法で解析されるためです。 上記の例では、常に $elseCondition
パートが最初なので、いつでも $firstCondition
だろう true
、その出力は表示されません。
正しいことは、入れ子になった三項演算子を一緒に避けることだと思います。 このスタック オーバーフローの回答で、この奇妙な動作について詳しく読むことができます。
さらに、PHP 7.4 では、括弧なしでチェーンされた 3 項を使用することは推奨されません。
# Null 合体演算子
先ほどのタイプ比較表をご覧になりましたか? null 合体演算子は、PHP 7.0 以降で使用できます。 三項演算子に似ていますが、次のように動作します isset
ブール値を使用するだけでなく、左側のオペランドで。 これにより、この演算子は、変数が設定されていない場合の配列やデフォルトの割り当てに特に役立ちます。
$undefined ?? 'fallback';
$unassigned;
$unassigned ?? 'fallback';
$assigned = 'foo';
$assigned ?? 'fallback';
'' ?? 'fallback';
'foo' ?? 'fallback';
'0' ?? 'fallback';
0 ?? 'fallback';
false ?? 'fallback';
null 合体演算子は 2 つのオペランドを取ります。 バイナリ オペレーター。 ちなみに「合体」とは、「集まって一つの塊または全体を形成すること」を意味します。 2 つのオペランドを取り、左側のオペランドの値に基づいてどちらを使用するかを決定します。
# 配列での null 合体
この演算子は、次のように機能するため、配列と組み合わせると特に便利です。 isset
. これは、冗長な式を記述しなくても、ネストされたキーであっても、キーの存在をすばやく確認できることを意味します。
$input = [
'key' => 'key',
'nested' => [
'key' => true
]
];
$input['key'] ?? 'fallback';
$input['nested']['key'] ?? 'fallback';
$input['undefined'] ?? 'fallback';
$input['nested']['undefined'] ?? 'fallback';
null ?? 'fallback';
最初の例は、三項演算子を使用して記述することもできます。
$output = isset($input['key']) ? $input['key'] : 'fallback';
配列キーの存在をチェックするときは、省略形の三項演算子を使用できないことに注意してください。 実際の左側のオペランドの値ではなく、エラーをトリガーするか、ブール値を返します。
$output = isset($input['key']) ?: 'fallback'
$output = $input['key'] ?: 'fallback';
# Null合体連鎖
null 合体演算子は簡単に連鎖できます。
$input = [
'key' => 'key',
];
$input['undefined'] ?? $input['key'] ?? 'fallback';
# ネストされた合体
チェーン内のプロパティが null
.
$a = (object) [
'prop' => null,
];
var_dump($a->prop->b ?? 'empty');
# Null合体代入演算子
PHP 7,4 では、「null 合体代入演算子」と呼ばれるさらに短い構文が期待できます。
function (array $parameters = [])
$parameters['property'] ??= 'default';
この例では、 $parameters['property']
に設定されます 'default'
、関数に渡される配列に設定されていない限り。 これは、現在の null 合体演算子を使用すると、次のようになります。
function (array $parameters = [])
$parameters['property'] = $parameters['property'] ?? 'default';
# 宇宙船オペレーター
宇宙船オペレーターは、非常に独特な名前を持っていますが、非常に便利です。 比較に使う演算子です。 常に次の 3 つの値のいずれかを返します。 0
、 -1
また 1
.
0
両方のオペランドが等しい場合に返されます。
1
左オペランドが大きい場合、および -1
右オペランドが大きい場合。 簡単な例を見てみましょう。
1 <=> 2;
この単純な例は、それほど興味深いものではありませんよね? ただし、宇宙船のオペレーターは単純な値以上のものを比較できます。
'a' <=> 'z';
[2, 1] <=> [2, 1];
[[1, 2], [2, 2]] <=> [[1, 2], [1, 2]];
'Z' <=> 'z';
奇妙なことに、大文字と小文字を比較すると、小文字が最も高いと見なされます。 簡単な説明ですが。 文字列の比較は、文字ごとに比較することによって行われます。 文字が異なるとすぐに、それらの ASCII 値が比較されます。 ASCII テーブルでは大文字の後に小文字が来るため、値が大きくなります。
# オブジェクトの比較
宇宙船のオペレーターは、オブジェクトでさえ、ほとんど何でも比較できます。 オブジェクトの比較方法は、オブジェクトの種類に基づいています。 組み込みの PHP クラスは独自の比較を定義できますが、ユーザーランド オブジェクトは属性と値に基づいて比較されます。
あなたが尋ねるオブジェクトを比較したいのはいつですか? 実は非常に明白な例があります: 日付です。
$dateA = DateTime::createFromFormat('Y-m-d', '2000-02-01');
$dateB = DateTime::createFromFormat('Y-m-d', '2000-01-01');
$dateA <=> $dateB;
もちろん、日付の比較は一例にすぎませんが、それでも非常に便利です。
# ソート機能
この演算子の優れた用途の 1 つは、配列の並べ替えです。 PHP で配列をソートする方法は多数あり、これらのメソッドのいくつかでは、ユーザー定義のソート関数を使用できます。 この関数は 2 つの要素を比較し、返す必要があります。 1
、 0
、 また -1
彼らの立場に基づいています。
宇宙船オペレーターの優れたユースケースです!
$array = [5, 1, 6, 3];
usort($array, function ($a, $b)
return $a <=> $b;
);
降順に並べ替えるには、比較結果を反転するだけです。
usort($array, function ($a, $b)
return -($a <=> $b);
);
こんにちは、読んでくれてありがとう! このブログ投稿がお役に立てば幸いです。 私に連絡したい場合は、 ツイッター または電子メールで。 私はいつもチャットが大好きです!