ツイート
シェア
LINEで送る
B! はてぶでブックマーク
Pocketでブックマーク
RSSフィード

PHPは '...' のことをスプレッド演算子とは言っていない。

php
イラストダウンロードサイト【イラストAC】
の画像をもとに加工しています。

プログラミングでは、複数の変数をまとめて表現するのに '...' を使い、一般的にスプレッド演算子といいます。またはスプレッド構文ともいう。

しかしPHPは『スプレッド』という言葉は使いません。アンパックと表現しますが世間的にはスプレッド演算子/構文と言われています。

PHPではスプレッド演算子とは言わない

PHPは他言語の良いものを後追いで追加するのが目立つプログラミング言語です。そのスタンスから思想がない、節操がないと揶揄されることも。

そんなPHPにもいわゆるスプレッド演算子・スプレッド構文(spread operator)があります。でもPHPでは、このことを『スプレッド』とは言いません。

PHPの公式リファレンス、php.netでは『...演算子』、そしてこれを使う構文のことを『アンパック(unpacking)』と表現しています。

それは、PHPの技術仕様RFCに『argument unpacking (AKA spread operator)』と書いてあるように、スプレッド演算子は『いわゆる』『別名』あつかい。

(AKAにはそういう意味がある。)

RFC (Request for Comments)

IETFが標準化を推し進めるために公開している仕様の文書のこと。

日本語訳文書は、企業や社団法人などの団体が公開しているが、全網羅されたものはない。

また、訳の正確性も担保されてないので、原文(英語)を読むことが推奨されている。

和訳を参考する分には構わないが、そのときは原文のチェックも忘れずに。ただ、今の翻訳機能はかなりのものなので原文を読むほうが早い。

IETF(Internet Engineering Task Force, インターネット技術特別調査委員会)

インターネットに関する仕様の標準化を推し進めているNPO。

Internet Engineering Task Force - Wikipedia

その割にはRFCのタイトルに思いっきり『Spread Operator』って入ってるけど。

spreadには『広げる・開ける・流布する』という意味があり、unpackには『解いて中身を取り出す・中身を取り出す』の意味がある。

ニュアンス的にはアンパックのほうが機能に沿ってる気がする。

だからPHPはこだわる? すでにスプレッドが一般的な言葉になってるのに。

『スプレッド』ワードでは検索結果で埋もれるPHP公式ドキュメント

そうなってるので、たとえば『php スプレッド演算子』と検索してもphp.netのヒットは微妙。ぱっと見、当たりっぽい情報は第3者が発信しているものばかり。

(自分もその側だけど。)

php.netは7番目ぐらいに出る。公式リファレンスにしては下位。

通常、公式リファレンスはトップに表示されるんですが、Googleはphpとスプレッドのワードの組み合わせがない公式の順位を下げます。

(そりゃそう。PHPが使ってないんだから。)

意図した検索結果を出したければワードに『アンパック』を使え!

公式リファレンスを正確にヒットさせるには『php アンパック』『php.net アンパック』で検索したほうが意図した結果を出せます。

スプレッド演算子で上位にヒットしないのは、PHPは使ってないけど、世間一般的にはスプレッド演算子と呼ぶほうが多いため。

PHPでもスプレッド演算子を使う公式でない情報源があふれてるので、公式がその中で埋もれてしまいます。

検索サイトでは、一次情報(本家)よりも第3者の二次・三次情報が優先されてしまう悲しい例。

第3者の一人の自分が言うのもなんなんだが。

(じっさい、この状況があまりにひどく、検索を多用する人ほどGoogleを避ける傾向がある。)

なぜ、スプレッド演算子が広まった?

同じWeb系のプログラミング言語にJavaScriptがありますが、JSにもスプレット演算子があります。

ES2015から導入されました。

ECMAScript(エクマスクリプト)

JavaScriptの仕様のこと。Ecma International(エクマ・インターナショナル)がJavaScriptの書き方を決めている(仕様の策定・勧告)。

実質的な策定作業はTC39が行い、それに基づいてEcma Internationalが勧告する。勧告されると『ES20**(年代)』という名称がつけられる。

Ecma Internationalは、もともとヨーロッパの電子通信に関する標準化団体なので、JavaScriptだけを扱っているわけではない。

ES2015(ES6)

2015年に策定された第6版のこと。JavaScriptの従来の書き方から大幅に改善されたので、インターネット上の情報も多い。

ES2015から1年ごとに仕様を勧告することになったので、公式の名称では版数を使うのをやめた。(ES6は昔の言い方の名残り。正式なドキュメントには書いてある。)

ES6という呼び方は、変化の過渡期なので許されているだけ。

ES2016

2016年に勧告された仕様。ES7という表現が見られるが、ES2016のほうが分かりやすいのでES6ほど一般的じゃない。

ES5

2015年に大幅な変更が行われる前のJavaScriptの仕様。第5版。2009年に勧告。現在、どんなに古いバージョンのブラウザでも動かすことができる基準になっている。

JavaScriptのトランスパイルが簡単にできるようになったので、すべてのブラウザに対応できるJavaScriptの呼び方として使われる。

(トランスパイルは別のバージョンのJavaScriptのプログラムに変換すること。)

ESNext

次世代のJavaScriptの仕様のこと。まだ勧告されていなくてTC39で策定中の仕様のことを指す。

すべてのブラウザが対応していないES2015以降を指して使っていることも多い。

トランスパイルが簡単になったので、Reactなどのフレームワークや、Node.jsのプラグイン開発など、ESNextでプログラミングすることが当たり前になっている。

次世代の仕様なので、短くかんたんに書けることも多く、SPA(Single Page Application)などの大規模・複雑な開発で使われる。

もちろん、Nextの範囲はES20**がリリースされるごとに変わる。その状況は下記リンクにある。


各ブラウザとそのバージョンの、仕様の対応状況を確認することができる。

TC39(Technical Committee 39, 専門委員会39)

ECMAScriptの仕様の策定を行う専門委員会。Ecma InternationalはいろいろなTCを持っているので番号が振られている(ECMAScriptの仕様は39)。

作業中の内容や仕様などはGitHubで公開されていて確認できる。

作業は5ステージに分けて行い、すべてのステージが終了するとEcma Internationalが勧告する。

Stage 0Strawman
たたき台・試案
どんな仕様を導入するか? 策定作業に
入るか? を決める。
Stage 1Proposal
提案
仕様の策定作業の枠組みを作ったり問
題点の洗い出しを行う。
Stage 2Draft
下書き・草案
JavaScriptでじっさいに書く。
プログラミングの書き方を決める。

ドキュメントには『正確に』とあるの
で、あいまいなことは残さない。
Stage 3Candidate
候補
一般の開発者にドラフトを公開してフ
ィードバックする。
(お試し期間)
Stage 4Finished
完了
ECMAScriptの標準に追加できる準備
ができている状態。

いつでも勧告できることを表す。

各ブラウザは、勧告されるのを待っているわけではなく、独自に先行して導入することもある。その経過は誰でも確認できる

参考:TC39の公式ドキュメント

GitHub - tc39/ecma262

じゃあ、いつもの後追いでJavaScriptのパクりか? と思いがちですが微妙です。PHPの ...演算子は PHP5.6から導入されました。

PHP5.6のリリース日は2014年8月28日。JSのES2015は名前にある通り2015年6月にリリースされた仕様。

どっちが先かなんて分かりません。

言えるのは、PHPよりもJavaScriptのほうが人気があり、JSがサーバーサイドまでできるようになったので、'...' は『スプレッド演算子』『スプレッド構文』という声が大きいからでしょう。

PHPは使ってないワードをあえてRFCに別名 Spread Operator と書いちゃうほどに。

前の投稿
PHP extract, 変数展開で超便利。だけど注意点がいっぱいの関数
PHP関数ってなんで'test'()でも実行できるの? いらんもの付けても動く何じゃそりゃの仕様。
次の投稿
コメントを残す

*