63447


機能についての説明はあるのですが、エルビス演算子との記載はありません

> もうひとつの条件演算子として "?:"（あるいは三項）演算子があります。

[公式ドキュメント(日本語)](https://www.php.net/manual/ja/language.operators.comparison.php#language.operators.comparison.ternary)  
[公式ドキュメント(英語)](https://www.php.net/manual/en/language.operators.comparison.php#language.operators.comparison.ternary)

・PHPにおけるエルビス演算子は、他言語のエルビス演算子とは何か異なるのですか？  
・そもそもエルビス演算子という名称は一般的ではない？？


CC BY-SA 4.0
2020-02-28T23:02:36.987
63444
2020-02-29T00:59:39.110
7886
question
php
PHPにおけるエルビス演算子について


# 引用

## Wikipedia

[エルビス演算子 -
Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%AB%E3%83%93%E3%82%B9%E6%BC%94%E7%AE%97%E5%AD%90)

> この項目では、二項演算子の?:について説明しています。三項演算子の? :については「条件演算子」をご覧ください
>
> エルビス演算子 (英語: elvis operator) は、いくつかのプログラミング言語にある演算子で、字句構文は ?: である。三項条件演算子 (?
> :) と違い、この連続する2文字で1つの演算子であり、意味的には三項演算子の第二項 (A ? B : CのB)
> が無いもの、というような機能を持っている。
>
> Null合体演算子に似た制御機能を持つが、第一項の扱いが異なる。ただし、エルビス演算子にNull合体演算子の意味と役割を持たせている言語もある。

加えて、  
同Wikipediaの「サポートされる言語」の今回の回答に重要そうなところだけを引用しますと、

> PHPでは PHP 5.3より ? : の第二項を省略可能[6] (June 2009)。  
>  Apache Groovyではエルビス演算子?:は独立したオペレータとして文書化されている[7]。この機能はGroovy 1.5より追加された[8]
> (December 2007). GroovyはGNU GやPHPと異なり?
> :の第二項を省略することは許されておらず、?:の間にスペースを入れることはできない。

## PHPドキュメント

[PHP: 比較演算子 -
Manual](https://www.php.net/manual/ja/language.operators.comparison.php#language.operators.comparison.ternary)

> PHP 5.3 以降では、三項演算子のまんなかの部分をなくすこともできるようになりました。 式 expr1 ?: expr3 の結果は、expr1 が
> TRUE と同等の場合は expr1、 それ以外の場合は expr3 となります。
>
> 注意: 三項演算子は式であり、値としては評価されずに式の結果として評価される ことに注意してください。演算結果をリファレンスとして返したい場合に、
> これを知っておくことが大切です。結果をリファレンスとして返す関数で return $var == 42 ? $a : $b; とすることはできず、
> 警告が発生します。
>
> PHP 7 以降ではさらに、"??" 演算子 (null 合体演算子) が使えるようになりました。

# まとめ

引用ばかりになってしまい申し訳ありませんが、 **PHPの場合は三項演算子の「まんなかの部分、つまり第二項」を省略できるようにしただけの三項演算子**
のようです。

他の言語ではWikipediaにもあるとおり `?:` という独立した演算子として（二項演算子として）用意されているものもあるようです。

**Null合体演算子の役割をもたせているものもあり、会話のコンテキストが話者間で共通されていないと混乱を招きそうに感じます。**

ちなみにPHPでは`Null合体演算子`はドキュメントにある通り、  
**PHP7 以降で "??" 演算子 (null 合体演算子) が使えるようになった**ようです。

箇条書き形式でまとめると下記のようになるかと思います

  * `?:`とは 
    * 項数 
      * 三項演算子の第二項を省略できるようにしてある言語がある 
        * `?:` という二項演算子があるように錯覚する（おそらくワザと錯覚できるようにしている）
      * 二項演算子として用意している言語もある（Wikipediaはエルビス演算子は二項演算子のものを指すという立場のように見受けられる）
    * `Null合体演算子`の役割をもたせている言語もある 
      * `Null合体演算子` は `?:` ではなく `??` を用いている言語もよく見かける
      * `三項演算子の第二項を省略した?:` をNull合体演算子のように使うテクニックが存在する（あくまでも単なるプログラミング的技法であり、null専用ではない）

* * *

厳密に区別するのであれば、  
`二項演算子の?:` と
`三項演算子の?:`がありますが、`三項演算子の?:`が真ん中を省略できるようにしてきた言語が増えだしたので、見分けがつかなくなってきた感じですね。

エルビス演算子という言葉は、OOPerさんも書いていらっしゃるとおり、スラングをちょっと超えた程度だと思います。（私が初めてこの言葉を見たのは、記憶が曖昧ですが、3~4年ほど前なような気がします）


CC BY-SA 4.0
2020-02-28T23:52:51.233
63446
2020-02-29T00:59:39.110
2020-06-17T08:14:45.997
-1
9008
63444
answer


### 「そもそもエルビス演算子という名称は一般的ではない？？」が正解

と言って良いでしょう。Wikipediaの「[エルビス演算子](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%AB%E3%83%93%E3%82%B9%E6%BC%94%E7%AE%97%E5%AD%90)」に記載されている例からいくつか拾ってみると

  * [GNU C/C++ (GCCによる拡張)](https://gcc.gnu.org/onlinedocs/gcc/Conditionals.html#Conditionals) C言語に対する拡張の部分で三項演算子の第二項が省略可能なことは言及されているが、Elvis operatorなんて言い方は出てこない。

  * PHP ご質問中のリンク先にあるように、「三項演算子のまんなかの部分」を省略できることは書かれているが、「エルビス演算子」なんて言葉は出てこない。

  * [Apache Groovy](http://groovy-lang.org/operators.html#_elvis_operator) 「Elvis operator」で見出しが建てられているが、その本文は「The "Elvis operator" is ...」(意訳: 「いわゆる『エルビス演算子』と言うのは…」)てな感じで引用符付きの`"Elvis operator"`で始まっていて、必ずしも概念や意味が読み手の側にも定着した用語としては扱われていない。

  * [Kotlin](https://kotlinlang.org/docs/reference/null-safety.html#elvis-operator) 「Elvis operator」で見出しが建てられている。本文もKotlin言語における`?:`演算子の記述。ちなみにはっきり「論理型」の概念のあるKotlinでは、「三項演算子の第二項を省略したもの」とはだいぶ違う。

比較的古くに言語仕様が固まっている言語では「エルビス演算子」なんて言葉は使われていない、と言う傾向にあるように思われます。  
(サンプル数が少ないので、他の観点でも分けられそうですが。)

とにかく確実に言えるのは「三項演算子の第二項省略をサポートする言語でも『エルビス演算子』なんて言葉は使っていない場合がある」、と言うことですね。

と言うわけで「エルビス演算子」と言う言葉は、プログラマーズスラングをちょっと超えた程度の認知度の単語、と言うことになりそうです。


CC BY-SA 4.0
2020-02-29T00:06:52.150
63447
2020-02-29T00:06:52.150
13972
63444
answer