第4章 演算子

PHPでは多数の演算子が使用されます。以下に、いくつかの主要な演算子とその使用方法を示します。

算術演算子

これらは数学的な操作を実行します。加算、減算、乗算、除算、剰余(モジュロ)、そしてべき乗を行うことができます。

$a = 10;
$b = 20;

echo $a + $b;  // 出力: 30
echo $a - $b;  // 出力: -10
echo $a * $b;  // 出力: 200
echo $a / $b;  // 出力: 0.5
echo $b % $a;  // 出力: 0
echo $a ** 2;  // 出力: 100


代入演算子

これらは変数に値を代入するために使用されます。基本的な代入演算子は=, ですが、他にも複合代入演算子(+=, -=, *=, /=, %=など)があります。

$a = 10;
$b = 20;

$a += $b;  // $a = $a + $bと同等です。結果的に$aは30になります。
echo $a;  // 出力: 30

$a *= $b;  // $a = $a * $bと同等です。結果的に$aは200になります。
echo $a;  // 出力: 200


比較演算子

これらは値や変数を比較するために使用されます。等しい(==)、等しくない(!=)、より大きい(>)、より小さい(<)、より大きいか等しい(>=)、より小さいか等しい(<=)、厳密に等しい(===)、厳密に等しくない(!==)などがあります。

$a = 10;
$b = 20;

var_dump($a == $b);  // 出力: bool(false)
var_dump($a != $b);  // 出力: bool(true)
var_dump($a < $b);   // 出力: bool(true)
var_dump($a > $b);   // 出力: bool(false)
var_dump($a <= $b);  // 出力: bool(true)
var_dump($a >= $b);  // 出力: bool(false)


論理演算子

これらは複数の条件を結合するために使用されます。AND(&&またはand)、OR(||またはor)、NOT(!)などがあります。

$a = true;
$b = false;

var_dump($a && $b);  // 出力: bool(false)
var_dump($a || $b);  // 出力: bool(true)
var_dump(!$a);       // 出力: bool(false)


インクリメント/デクリメント演算子

++と--はそれぞれ変数の値を1増やす、または1減らすことができます。

$a = 10;

$a++;  // $aの値を1増やします。$aは11になります。
echo $a;  // 出力: 11

$a--;  // $aの値を1減らします。$aは10になります。
echo $a;  // 出力: 10


文字列演算子

PHPでは、.演算子を使用して文字列を連結することができます。

$a = "Hello";
$b = "World";

echo $a . " " . $b;  // 出力: Hello World


配列演算子

配列同士を組み合わせるために、+, ==, !=, ===, !==演算子が使えます。また、+演算子を使用して配列を結合することも可能です。

$a = array("a" => "Apple", "b" => "Banana");
$b = array("c" => "Cherry", "b" => "Blueberry");

$c = $a + $b;  // 配列$aと$bを結合します。
print_r($c);  // 出力: Array([a] => Apple [b] => Banana [c] => Cherry)


三項演算子

?:演算子は、短いif-else文を一行で書くために使います。

$a = 10;
$b = ($a == 10) ? "Ten" : "Not Ten";

echo $b;  // 出力: Ten


Null合体演算子

PHP7以降では、新しい??演算子が導入されました。これは、変数がnullまたは未設定の場合にデフォルト値を提供します。

$a = null;
$b = $a ?? "Default Value";

echo $b;  // 出力: Default Value


スペースシップ演算子

PHP7以降では、新しい<=>演算子も導入されました。これは、二つの値を比較して、左辺が大きい場合は1、等しい場合は0、右辺が大きい場合は-1を返します。

$a = 10;
$b = 20;

echo $a <=> $b;  // 出力: -1

これらはPHPで利用可能な演算子の一部であり、それぞれが特定の目的で使用されます。また、PHPでは演算子の優先順位と結合性も重要で、これらはどの演算子が他の演算子よりも先に評価されるか、およびどの方向から評価されるかを決定します。これらの規則を理解しておくことで、コードの予期しない挙動を防ぎ、より正確で効率的なコードを書くことができます。


演算子の優先順位

演算子の優先順位は、特定の演算子が他の演算子よりも先に評価される順序を決定します。例えば、乗算と加算が同時に現れた場合、乗算は加算よりも優先的に評価されます。

以下に、高い優先順位から低い優先順位へと並べたPHPの主な演算子を示します。同じ行内の演算子は同じ優先順位を持ちます

  1. clone, new (クラスの複製と作成)
  2. [] (配列要素へのアクセス)
  3. ** (べき乗)
  4. ++, -- (インクリメント/デクリメント)
  5. !, ~ (論理NOT, ビットNOT)
  6. *, /, % (乗算、除算、剰余)
  7. +, - (加算、減算)
  8. . (文字列の連結)
  9. <<, >> (ビットシフト)
  10. <, <=, >, >= (比較)
  11. ==, !=, ===, !== (等価性と非等価性)
  12. & (ビットAND)
  13. ^ (ビットXOR)
  14. | (ビットOR)
  15. && (論理AND)
  16. || (論理OR)
  17. ?? (null合体演算子)
  18. ?: (三項演算子)
  19. =, +=, -=, *=, /=, .= etc. (代入)
  20. and (論理AND)
  21. xor (論理XOR)
  22. or (論理OR)

これらの演算子は左から右に評価されますが、例外もあります。例えば、代入演算子(=, +=, -= etc.)や論理演算子(and, or, xor)は右から左に評価されます。

括弧 () を使うと、優先順位を明示的にコントロールすることができます。括弧内の式は、その外部のどんな演算子よりも先に評価されます。このため、コードの読みやすさと明確さを確保するために、演算子の優先順位に頼るよりも括弧を積極的に使用することが推奨されます。


演算子の優先順位の実例

1.乗算、除算、剰余が加算や減算より優先されます。したがって、次の例では、乗算が先に行われ、その結果に1が加えられます。

$result = 1 + 2 * 3;  // 1 + (2 * 3) = 1 + 6 = 7


2.同じ優先順位の演算子は左から右へと評価されます。したがって、次の例では、最初に5から3が引かれ、その結果から2が引かれます。

$result = 5 - 3 - 2;  // (5 - 3) - 2 = 2 - 2 = 0


3.比較演算子は算術演算子よりも優先度が低いので、次の例では、まず算術演算が行われ、その結果が比較されます。

$result = 5 + 10 == 15;  // (5 + 10) == 15 = 15 == 15 -> true


4.論理演算子&&は論理演算子||よりも優先度が高いです。したがって、次の例では、まず$x > 0 && $x < 10が評価され、その結果が||によって評価されます。

$x = 5;
$result = $x > 0 && $x < 10 || $x == 100;  // ($x > 0 && $x < 10) || $x == 100 -> true || false -> true


5.括弧()を使うと、優先順位を制御することができます。次の例では、括弧内の比較が先に行われます。

$x = 5;
$result = $x > (0 && $x < 10) || $x == 100;  // $x > (0 && $x < 10) = 5 > 0 -> true


ビット演算子

ビット演算子は、整数のビット表現に対して直接操作を行うための演算子です。ビット演算子には、「ビット積」を表す&、「ビット和」を表す|、「ビット排他的論理和」を表す^、「ビット否定」を表す~、そして左シフト<<と右シフト>>の6種類があります。

ビット演算子は、特殊な状況やパフォーマンスが求められる場合に使用されます。しかし、普通のプログラミングではあまり使われないかもしれません。それでも、それらがどのように動作するかを理解しておくと、時折遭遇するそのような状況に対応するのに役立つでしょう。

以下に各ビット演算子の具体的な使用例を示します。

ビット積(&): 両方のビットが1のときに1を返し、それ以外は0を返します。
$a = 12;  // 2進数で1100
$b = 10;  // 2進数で1010
$result = $a & $b;  // 2進数で1000、10進数で8
echo $result;  // 出力: 8


ビット和(|): 少なくとも1つのビットが1のときに1を返し、それ以外は0を返します。
$a = 12;  // 2進数で1100
$b = 10;  // 2進数で1010
$result = $a | $b;  // 2進数で1110、10進数で14
echo $result;  // 出力: 14


ビット排他的論理和(^): 両方のビットが異なるときに1を返し、それ以外は0を返します。
$a = 12;  // 2進数で1100
$b = 10;  // 2進数で1010
$result = $a ^ $b;  // 2進数で0110、10進数で6
echo $result;  // 出力: 6


ビット否定(~): すべてのビットを反転します。1のビットは0に、0のビットは1になります。
$a = 12;  // 2進数で1100
$result = ~$a;  // 2進数で11111111111111111111111111110011、10進数で-13 (32ビット整数の場合)
echo $result;  // 出力: -13


左シフト(<<): 左に指定したビット数だけシフトします。空いたビットは0で埋められます。
$a = 3;  // 2進数で11
$result = $a << 2;  // 2進数で1100、10進数で12
echo $result;  // 出力: 12


右シフト(>>): 右に指定したビット数だけシフトします。空いたビットは0で埋められます。
$a = 12;  // 2進数で1100
$result = $a >> 2;  // 2進数で11、10進数で3
echo $result;  // 出力: 3


練習問題1.

ユーザーから2つの数字を入力してもらい、それらの数字の足し算、引き算、掛け算、割り算、剰余の結果を表示するプラグラムを作成してください。


練習問題2.

ユーザーから2つの数字を入力してもらい、1つ目の数字が2つ目の数字より大きいか、小さいか、または等しいかを判定するプログラムを作成してください。


練習問題3.

ユーザーから3つの数字を入力してもらい、それらの数字が全て10以上であるかどうかを判定するプログラムを作成してください。全て10以上であれば「全ての数字は10以上です。」と表示し、そうでなければ「10未満の数字が含まれています。」と表示してください。