LoginSignup
2
1

More than 5 years have passed since last update.

PHP7.1から配列を結合する配列演算子の配列結合演算子・プラス記号・加算記号。「+」がWarningになっていた

Last updated at Posted at 2018-10-24

誤報なのですが恥ずかしいのでこのままにしておきます。

きっかけ

動的型付けと静的型付け - Qiita

なお、これを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がエラーになるのもほんのすこし引っかかりましたが、それはあまり良くないコードなので今回は配列に対する+がメインということで)

動作結果

ということで動かしました

image.png

はえー
Warningレベルですがエラーが出てますね。

そもそも配列結合演算子とは何だったのか

配列に対する+はマニュアルにも乗っている配列演算子の一つで、結合を表します。

PHP: 配列演算子 - Manual

名前 結果
$a + $b 結合 $a および $b を結合する。

公式のこのページにはまだ変更のお知らせが無いですね…

実際に使う場合はよくarray_mergeと迷うあれでした。
違いは以下の早見表が役立ちます。

配列結合演算子, array_merge, array_replace を徹底比較 - Qiita

動作が完璧に同じではないので、それぞれ使いどころがあったのかなと思います。

正直、表でみても理解度が低いので被リンクのコメントも参照しておきます

配列の結合 - Qiita#comment-a0790a5ed95382aa74a5

配列に関しての操作のみまとめると

  • + 演算子は常に 連想配列 として 前優先 でキーをセットする
  • array_merge 関数は 文字列キーは連想配列 として 後優先 でキーをセットし、 整数キーは通常配列 として 末尾 に新しく要素を追加する

がわかりやすいでしょうか。

変更は通知されていた

7.1の変更点は軽く目を通していたつもりですが、見落としていました。

PHP: その他の変更 - Manual

その他の変更は本当に流し見の流し見レベルだったと思うので実際に影響あったのが驚きですね。

PHP7.1α1の新機能 - Qiita#warn-about-invalid-strings-in-arithmetic
では説明文的には配列も含まれますが、サンプルコードでは配列は記載されていませんね。(RFCですしリンク先の提案自体にarrayの影が見えないので誤訳・誤情報というわけではないと思います)

所感

正直、PHPのバグ、とまではいいませんけれど、なんだか非数値のStringに対する算術演算の警告に配列が巻き込まれた印象を受けます。

変更理由の文章やコードを見ても配列を考慮されていない雰囲気を受け取ってしまいます。

でも、7.3まで現状のままということは正しいんですよね。
配列結合演算子に対応する関数を新設して、配列結合演算子はdeprecatedでもよかったのかなと思いました。

2
1
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1