ikemonn's blog

技術ネタをちょこちょこと

【PHP】++$varと$var++の違い

結論

インクリメント・デクリメントされるタイミングが異なる。

説明

演算子 名称 返り値
$var++ 後置インクリメント $var
++$var 前置インクリメント $var + 1
$var-- 後置デクリメント $var
--$var 前置デクリメント $var - 1

参考:プログラミングPHP(O'REILLY)

  • 後置インクリメント(デクリメント)は、インクリメント(デクリメント)する前に元の値を返す。
  • 前置インクリメント(デクリメント)は、インクリメント(デクリメント)した後で新しい値を返す。

文字よりコードを見た方が分かりやすいです。

後置インクリメント

<?php
$var = 1;
echo '$var++は、' . $var++; #インクリメントする前に元の$var = 1を返す
echo '$varは、' . $var;     #インクリメントした後の新しい値を返す
#$var++は、1
#$varは、2

前置インクリメント

<?php
$var = 1;
echo '++$varは、' . ++$var; #インクリメントした後の$var = 2を返す
echo '$varは、' . $var;     #既にインクリメントされているので$var = 2
#++$varは、2
#$varは、2

ベンチマーク

PHP 5.5.6 前置インクリメント(デクリメント)の方が最大3.8%ほど速かったが、誤差の範囲内ではなかろうか。 (++$iを2回行っているのは、初めの++$iが何故かかなり遅くなるため)

SS 2014-01-25 16.00.10.png

<?php
require_once('Benchmark/Timer.php');

function before_inc($num) {
    for($i = 0; $i < $num; ++$i) {

    }
}

function after_inc($num) {
    for($i = 0; $i < $num; $i++) {
        
    }
}


function before_dec($num) {
    for($i = $num; $i > 0; --$i) {
        
    }
}

function after_dec($num) {
    for($i = $num; $i > 0; $i--) {
        
    }
}

$num = 10000;
echo $num . "\n";

$timer = new Benchmark_Timer();
$timer->start();

before_inc($num);
$timer->setMarker('++$i_1');

before_inc($num);
$timer->setMarker('++$i_2');

after_inc($num);
$timer->setMarker('$i++');

before_dec($num);
$timer->setMarker('--$i');

after_dec($num);
$timer->setMarker('$i--');

$timer->stop();
$timer->display();

参考

プログラミングPHP 第2版

プログラミングPHP 第2版

前置インクリメントと後置インクリメントの違い

PHPパフォーマンスベンチマーク 後置加算・後置減算(++, --)より前置加算・前置減算(++, --)が高速