誤報なのですが恥ずかしいのでこのままにしておきます。
きっかけ
なお、これをPHPですると
function add( $a, $b )
{
return $a + $b;
}
1. add( 1, 5 ); // 6
2. add( 1.5, 3.2 ); // 4.7
3. add( 3, 3.5 ); // 6.5
4. add( "1", "5" ); // 6
5. add( "hoge", "hoge" ); // error
6. add( [1, 3, 5], [6, 8, 9] ); // error
1,2,3は想定内です。4が「6」になるのは暗黙の型変換によるものでしょう。PHPの場合、文字列結合はドット演算子「.」になりますので、ここでは数値型へ強制変換されたのかと。5.6については、当然エラーとなってしまいます。
5.6については、当然エラーとなってしまいます。
え、6がエラーになるなんて逆に想定外なんですけど。
(5の非数値Stringがエラーになるのもほんのすこし引っかかりましたが、それはあまり良くないコードなので今回は配列に対する+
がメインということで)
動作結果
ということで動かしました
はえー
Warningレベルですがエラーが出てますね。
そもそも配列結合演算子とは何だったのか
配列に対する+
はマニュアルにも乗っている配列演算子の一つで、結合を表します。
例 | 名前 | 結果 |
---|---|---|
$a + $b
|
結合 |
$a および $b を結合する。 |
公式のこのページにはまだ変更のお知らせが無いですね…
実際に使う場合はよくarray_merge
と迷うあれでした。
違いは以下の早見表が役立ちます。
配列結合演算子, array_merge, array_replace を徹底比較 - Qiita
動作が完璧に同じではないので、それぞれ使いどころがあったのかなと思います。
正直、表でみても理解度が低いので被リンクのコメントも参照しておきます
配列の結合 - Qiita#comment-a0790a5ed95382aa74a5
配列に関しての操作のみまとめると
-
+
演算子は常に 連想配列 として 前優先 でキーをセットする
array_merge
関数は 文字列キーは連想配列 として 後優先 でキーをセットし、 整数キーは通常配列 として 末尾 に新しく要素を追加する
がわかりやすいでしょうか。
変更は通知されていた
7.1の変更点は軽く目を通していたつもりですが、見落としていました。
その他の変更は本当に流し見の流し見レベルだったと思うので実際に影響あったのが驚きですね。
PHP7.1α1の新機能 - Qiita#warn-about-invalid-strings-in-arithmetic
では説明文的には配列も含まれますが、サンプルコードでは配列は記載されていませんね。(RFCですしリンク先の提案自体にarrayの影が見えないので誤訳・誤情報というわけではないと思います)
所感
正直、PHPのバグ、とまではいいませんけれど、なんだか非数値のStringに対する算術演算の警告に配列が巻き込まれた印象を受けます。
変更理由の文章やコードを見ても配列を考慮されていない雰囲気を受け取ってしまいます。
でも、7.3まで現状のままということは正しいんですよね。
配列結合演算子に対応する関数を新設して、配列結合演算子はdeprecatedでもよかったのかなと思いました。