make is.dev make it simple. development.
2024年9月5日

前置/後置インクリメント

PHPにおけるインクリメント(デクリメント)の前置/後置について考えてみる。
PHPではあまり議論に上がる事がないが、他者のソース見てると後置が多いので気にかかり。

前談

前置インクリメント、後置インクリメントというのは、以下の話。

<?php

$i = 1;

// 前置インクリメント
++$i;

// 後置インクリメント
$i++;

// $iは3になる
PHP

どちらも $i を+1するというのは同じだが、この2つは別物。

上記の内容だと違いが分かりづらいが、以下にすると違いが目に見える。

<?php

$i = 1;

// 前置インクリメント
echo ++$i;    // 2

// 後置インクリメント
echo $i++;    // 2

// $iは3になる
PHP

前置インクリメントではechoの前に+1されているが、後置ではechoの後に+1される。

それぞれのメリット・デメリット

処理負荷

前置インクリメントの方が負荷が少ない。なので後置より速い。
(微々たる違いではあるが)

該当処理の開始タイミング

該当処理(上記例では echo の事)の実行タイミングは後置インクリメントの方が速い。
前置インクリメントの場合、+1 されるのを待ってから処理されるため。
(微々たる違いではあるが)

他言語を意識するなら.1

他言語では、前置インクリメントは並列処理において同じデータを扱う際に、前項で触れた +1 されるのを待つ事が遅延に繋がる、という問題点が挙げられる。
(並列処理側でも待ちが発生する)

ただ、PHPの主な用途(WEBシステム開発等)の範囲では並列処理が問題になることは想像がつかず。
(筆者の知識・経験不足かもしれないが)

他言語を意識するなら.2

言語によっては、後置インクリメントしかなかったりする。
なので、他言語も併用している等でコーディング規約上揃えたい等の場合は後置の方が無難。
(インクリメント自体がなかったり、使用方法が限定されている言語もある)

他言語を意識するなら.3

1文に複数の同じ変数への前置インクリメントがある場合、言語(コンパイラ)によって扱いに違いが出る。
例えば以下のようなケース。

<?php

$i = 1;

// 前置インクリメント
echo ++$i + ++$i;    // 5
PHP

PHPでは5が出力されるが、言語(コンパイラ)によっては6が出力されるものがある。

使い方によって結果がブレるので、ここでも前置インクリメントは議論の的になる。

私見としては、一貫性がないのは理解出来るが、コードの可読性を考えたらそんな使い方する事に問題があるんじゃないか、という気がする。

結論

私見ではあるが、
・前置/後置の違いを理解して使い分けられるのがベストなのは言うまでもない
・その上で、PHPでは原則前置インクリメントを使った方が良い
という見解。

他言語や作るもの(並列処理を意識するか)で事情が違ってくるが、PHPにおいてはあまり関係ない。

それならば、微々たる違いだとしてもあえて遅い方を使う理由がない。
ループの中で使うことが多いので、微々たる違いとはいえ塵も積もればなんとやら。

前置/後置はC++では議論されることが多いが、PHPで触れられているのを見かけないので触れてみた。
が、触れられないのは考慮する程のものではない、という話なのかもしれない。

それなら前置に揃えたら良いのになぁ、、、。
書籍では後置ばかりが使われていて理由が気になる。

ちなみに、本サイトで取り上げているライブラリをざっと見てみた所、以下でした。

・PhpSpreadsheet : 前置
・OpenSpout : 前置
・Carbon : 後置(必要に応じて一部前置)
・Google API Client : 後置