PHP: 演算子

PHP: 演算子

September 8, 2020
PHP
PHP

PHP の演算子について。

算術演算子 #

<?php
$a = 10;
$b = 3;
var_dump([
  '+$a' => +$a,
  '-$a' => -$a,
  '$a + $b' => $a + $b,
  '$a - $b' => $a - $b,
  '$a * $b' => $a * $b,
  '$a / $b' => $a / $b,
  '$a % $b' => $a % $b,
  '$a ** $b' => $a ** $b,
]);
array(8) {
  ["+$a"]=>
  int(10)
  ["-$a"]=>
  int(-10)
  ["$a + $b"]=>
  int(13)
  ["$a - $b"]=>
  int(7)
  ["$a * $b"]=>
  int(30)
  ["$a / $b"]=>
  float(3.3333333333333)
  ["$a % $b"]=>
  int(1)
  ["$a ** $b"]=>
  int(1000)
}

代入演算子 #

<?php
var_dump([
  '=' => $a = 3,
  '+=' => $a += 1,
  '-=' => $a -= 1,
  '*=' => $a *= 2,
  '/=' => $a /= 3,
  '%=' => $a %= 3,
]);
array(8) {
  ["="]=>
  int(3)
  ["+="]=>
  int(4)
  ["-="]=>
  int(3)
  ["*="]=>
  int(6)
  ["/="]=>
  int(2)
  ["%="]=>
  int(2)
}

上記以外にも **= &= |= ^= <<= >>= .= ??= がある。

ビット演算子 #

<?php
var_dump([
  '0b1100 AND(&) 0b1010'     => 0b1100 & 0b1010,
  '0b1100 OR (|) 0b1010'     => 0b1100 | 0b1010,
  '0b1100 XOR(^) 0b1010'     => 0b1100 ^ 0b1010,
  '       NOT(~) 0b1010'     =>        ~ 0b1010,
  '0b1100 Shift Left (<<) 1' => 0b1100 << 1,
  '0b1100 Shift Right(>>) 1' => 0b1100 >> 1,
]);
array(6) {
  ["0b1100 AND(&) 0b1010"]=>
  int(8)
  ["0b1100 OR (|) 0b1010"]=>
  int(14)
  ["0b1100 XOR(^) 0b1010"]=>
  int(6)
  ["       NOT(~) 0b1010"]=>
  int(-11)
  ["0b1100 Shift Left (<<) 1"]=>
  int(24)
  ["0b1100 Shift Right(>>) 1"]=>
  int(6)
}

比較演算子 #

<?php
$a = 1;
$b = 2;
var_dump([
  '$a ==  $b' => $a ==  $b,
  '$a === $b' => $a === $b,
  '$a !=  $b' => $a !=  $b,
  '$a <>  $b' => $a <>  $b,
  '$a !== $b' => $a !== $b,
  '$a <   $b' => $a <   $b,
  '$a >   $b' => $a >   $b,
  '$a <=  $b' => $a <=  $b,
  '$a >=  $b' => $a >=  $b,
  '$a <=> $b' => $a <=> $b,
]);
array(10) {
  ["$a ==  $b"]=>
  bool(false)
  ["$a === $b"]=>
  bool(false)
  ["$a !=  $b"]=>
  bool(true)
  ["$a <>  $b"]=>
  bool(true)
  ["$a !== $b"]=>
  bool(true)
  ["$a <   $b"]=>
  bool(true)
  ["$a >   $b"]=>
  bool(false)
  ["$a <=  $b"]=>
  bool(true)
  ["$a >=  $b"]=>
  bool(false)
  ["$a <=> $b"]=>
  int(-1)
}

== vs === #

== は type juggling で暗黙の型変換が発生する。 === は厳密比較で型の一致までチェックされる。

<=> #

別名「spaceship operator」、 -1 or 0 or +1 が返るソートで使うやつ。

エラー制御演算子 #

式の頭に @ を付与すると、その式が生成するエラーが省略される。エラー制御演算子がない場合、

<?php
$my_file = file('non_existent_file')
Warning: file(non_existent_file): failed to open stream: No such file or directory in /usr/src/myapp/err_ope.php on line 2

ある場合、

<?php
$my_file = @file('non_existent_file');

何も出力されない。

実行演算子 #

バックスラッシュで括った内容はシェルコマンドとして実行され、その出力結果が戻り値となる。

<?php
$output = `pwd`;
echo $output;
/usr/src/myapp

加算演算子、減算演算子 #

++$a --$a $a++ $a--

論理演算子 #

$a and $b $a o $b $a xor $b !$a $a && $b $a || $b`

結合優先順は && || の方が and or よりも高い。

文字列演算子 #

ドット . で文字列結合。

<?php
var_dump([
  "hello" . "world",
  "with int_val:" . 1,
  "with float_val:" . 1.234,
  "with bool_val:" . true,
  "with array:" . [1,2,3],
  "with null:" . null,
]);
array(6) {
  [0]=>
  string(10) "helloworld"
  [1]=>
  string(14) "with int_val:1"
  [2]=>
  string(20) "with float_val:1.234"
  [3]=>
  string(15) "with bool_val:1"
  [4]=>
  string(16) "with array:Array"
  [5]=>
  string(10) "with null:"
}

文字列に + 演算子を適用するとどうなるか?答えは暗黙の型変換が発生し、ワーニングが出力される。

<?php
echo "some" + "string";

Warning: A non-numeric value encountered in /usr/src/myapp/a.php on line 2

Warning: A non-numeric value encountered in /usr/src/myapp/a.php on line 2
0

配列演算子 #

+ で結合、 == は等しいキー/バリューを持つ場合に TRUE を返す。 === であればさらに型の一致までチェックする。

<?php
$a = ['a' => 1, 'b' => 2, 'c' => 3];
$b = [          'b' => 4, 'c' => 5, 'd' => 6];
var_dump([
  '$a + $b' => $a + $b,
  '$b + $a' => $b + $a,
  '[1,2] + [3,4]' => [1,2] + [3,4],
]);
array(3) {
  ["$a + $b"]=>
  array(4) {
    ["a"]=>
    int(1)
    ["b"]=>
    int(2)
    ["c"]=>
    int(3)
    ["d"]=>
    int(6)
  }
  ["$b + $a"]=>
  array(4) {
    ["b"]=>
    int(4)
    ["c"]=>
    int(5)
    ["d"]=>
    int(6)
    ["a"]=>
    int(1)
  }
  ["[1,2] + [3,4]"]=>
  array(2) {
    [0]=>
    int(1)
    [1]=>
    int(2)
  }
}

$a + $b と書いた場合、 $a に含まれないキーのキー/バリューが $b から結合される。 PHP では全て連想配列のため、 [1,2] + [3,4] は、両配列が 01 をキーに持つ配列のため [1,2,3,4] となるわけではなかった。

型演算子 #

instanceof で特定のクラスから作成されたインスタンスかどうかをチェックできる。

<?php
class Hoge {}
$hoge = new Hoge;
var_dump($hoge instanceof Hoge);
bool(true)

スカラー型や array に関しては is_int()is_array() などの関数でチェックする。