[Memo]PHP<演算子> 2015.08.31
PHP 基本ここでは『独習PHP 第2版』で学んだポイントを箇条書きで記す。
演算子の種類
代数演算子
代入演算子
比較演算子
論理演算子
ビット演算子
その他の演算子
代数演算子(算術演算子)
四則演算をはじめ、日常的な数学で使用する演算子
+ | 数値の和 | 4 + 8 // 12 |
– | 数値の差 | 7 – 2 // 5 |
* | 数値の積 | 2 * 6 // 12 |
/ | 数値の商 | 10 / 5 // 2 |
% | 数値の余剰 | 13 % 3 // 1 |
++ | 前置加算 | $i = 8; $j = ++$i; // $j は 9 $i は 9(代入前に加算) |
++ | 後置加算 | $i = 8; $j = $i++; // $j は 8 $i は 9(代入後に加算) |
— | 前置減算 | $i = 2; $j = –$i; // $j は 1 $i は 1(代入前に減算) |
— | 後置減算 | $i = 2; $j = $i–; // $j は 2 $i は 1(代入後に減算) |
++ は加算子(インクリメント演算子)
– は減算子(デクリメント演算子)
マジカルインクリメント
アルファベットと数値が混在した文字列に対して加算子を使うと、アルファベットの場合は次の文字へ、数値の場合は1を加算する
1 2 3 4 5 6 7 8 9 |
<?php $i = 'Z'; print ++$i; // 結果: AA print ++$i; // 結果: AB $j = 'T8'; print ++$j; // 結果: T9 print ++$j; // 結果: U0 ?> |
配列の結合
加算演算子(+)で配列を結合する
1 2 3 4 5 6 |
<?php $array1 = array(1,3,5); $array2 = array(2,4,6,7); $result = $array1 + $array2; print_r($result); ?> |
実行結果:
Array ( [0] => 1 [1] => 3 [2] => 5 [3] => 7 )
通常配列の場合、インデックス番号が重複した場合は、後の値は無視される
そして、新たなインデックス番号の値だけが結合される
→通常配列の場合は、array_merge命令を利用する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php $manga1 = array( '藤崎竜' => '封神演義', '和月伸宏' => 'るろうに剣心', '小畑健' => 'ヒカルの碁', '荒木飛呂彦' => 'ジョジョの奇妙な冒険' ); $manga2 = array( '武井宏之' => 'シャーマンキング', '小畑健' => 'DEATHNOTE', '井上雄彦' => 'SLAMDUNK' ); $result = $manga1 + $manga2; print_r($result); ?> |
実行結果:
Array ( [藤崎竜] => 封神演義 [和月伸宏] => るろうに剣心 [小畑健] => ヒカルの碁 [荒木飛呂彦] => ジョジョの奇妙な冒険 [武井宏之] => シャーマンキング [井上雄彦] => SLAMDUNK )
連想配列の場合も、通常配列と同様に重複したキーの値は無視され、それ以外が結合される
代入演算子
左辺で指定した変数に対して、右辺の値を代入するための演算子
= | 変数などに値を代入 | $x =10; |
+= | 左辺と右辺を加算した結果を、左辺に代入 | $x = 5; $x += 2; // 7 |
-= | 左辺から右辺を減算した結果を、左辺に代入 | $x = 5; $x -= 2; // 3 |
*= | 左辺と右辺を乗算した結果を、左辺に代入 | $x = 5; $x *= 2; // 10 |
/= | 左辺を右辺で除算した結果を、左辺に代入 | $x = 5; $x /= 2; // 2.5 |
%= | 左辺を右辺で除算した余りを、左辺に代入 | $x = 5; $x %= 2; // 1 |
.= | 左辺と右辺を連結した文字列を、左辺に代入 | $x = ‘kyary’; $x .= ‘pamyupamyu’ // kyarypamyupamyu |
&= | 左辺と右辺をビット論理積した結果を、左辺に代入 | $x = 10; $x &= 1; // 0 |
|= | 左辺と右辺をビット論理和した結果を、左辺に代入 | $x = 10; $x |= 1; // 11 |
^= | 左辺と右辺をビット排他論理和した結果を、左辺に代入 | $x = 10; $x ^= 1; // 11 |
<<= | 左辺を右辺の値だけ左シフトした結果を、左辺に代入 | $x = 10; $x <<= 1; // 20 |
>>= | 左辺を右辺の値だけ右シフトした結果を、左辺に代入 | $x = 10; $x >>= 1; // 5 |
※ビット演算とは
整数を2進数で表したときの各桁(ビット単位)に対して論理計算を行う演算
10と1(10進数)の論理積の場合 → 10は1010(2進数)、1は0001(2進数) → 1010 0001 を各桁ずつ積算する(0×1=0, 1×0=0,…) → 結果は 0
論理和も同様
10と1(10進数)の排他的論理和の場合 → 1010 0001 の各桁において、どちらか一方が1の時は1、それ以外は0(0,1 → 1, 1,0 → 1,…) → 結果は 1011
「値による代入」と「参照による代入」
値による代入($x = 1; $y = $x;)は、代入した変数($x)と代入された変数($y)は別物のため、元の変数が変わっても($x = 5;)、代入された変数($y)に影響はない
1 2 3 4 5 6 |
<?php $x = 1; $y = $x; $x = 5; print $y; //結果: 1 ?> |
一方、参照(リファレンス)による代入($x = 1; $y =& $x;)の場合、
元の変数($x)と代入された変数($y)は同じアドレス(コンピュータ内のメモリ)にあるため、元の変数に対する変更($x = 5;)は、代入された変数($y)にも及ぶ
1 2 3 4 5 6 |
<?php $x = 1; $y =& $x; $x = 5; print $y; //結果: 5 ?> |
参照による代入には「=&」を使う
代入演算子「&=」とは別物
比較演算子
左辺と右辺を比較し、その結果をTRUE/FALSEとして返す
if / while / do~while のような条件分岐/繰り返し命令で条件式を表すために使う
== | 左辺と右辺の値が等しい場合はTRUE | 7==7 // TRUE |
=== | 左辺と右辺が等しく、かつ、同じデータ型である場合はTRUE | 7===7 // TRUE |
!= | 左辺と右辺の値が等しくない場合にTRUE | 7 != 7 // FALSE |
<> | 左辺と右辺の値が等しくない場合にTRUE(!=と同じ) | 7 <> 7 // FALSE |
!== | 左辺と右辺の値が等しくない、または、同じデータ型でない場合にTRUE | 7 !== ‘7’ // TRUE |
< | 左辺が右辺より小さい場合にTRUE | 7 < 10 // TRUE |
> | 左辺が右辺より大きい場合にTRUE | 7 > 10 // FALSE |
<= | 左辺が右辺以下の場合にTRUE | 7 <= 10 // TRUE |
>= | 左辺が右辺以上の場合にTRUE | 7 >= 10 // FALSE |
?: | 「条件式 ? 式1 : 式2」。 条件式がTRUEの場合は、式1。FALSEの場合は、式2 |
(10 > 1) ? ‘正しい’ : ‘間違い’ // 正しい |
文字列混在の比較
等価演算子「==」は、数値と文字列を比較する時、文字列を数値に変換して比較する
1 2 3 4 5 6 7 8 9 10 11 |
<?php var_dump('3.14' == 3.14000); // bool(true) '3.14' → 3.14 var_dump('3.14E2' == 314); // bool(true) '3.14E2' → 314 var_dump('0x10' == 16); // bool(true) '0x10'は16進数で16 var_dump('010' == 8); // bool(false) '010'は8進数だが認識されない var_dump('1.3xyz' == 1.3); //bool(true) 数値文字列混在は、先頭数値だけが認識 var_dump('X' == 0); //bool(true) // 'X'は先頭に数値がないため、0と認識 var_dump('3.14' == '3.14000'); //bool(true) 互いに数値に変換されて比較 var_dump('3.14E2' == '314'); //bool(true) 互いに数値に変換されて比較 var_dump('1.3xyz' == '1.3'); //bool(false) 文字列で比較される ?> |
厳密な等価演算子「===」
特に文字列同士の比較では、予想しにくい挙動を避けるため、厳密な等価演算子「===」を使用する
1 2 3 4 5 6 7 8 |
<?php var_dump('3.14E2' == 314); //bool(true) var_dump('3.14E2' === 314); //bool(false) var_dump('X' == 0); //bool(true) var_dump('X' === 0); //bool(false) var_dump('1' == 1); //bool(true) var_dump('1' === 1); //bool(false) ?> |
配列の比較
配列の比較は次の順序で行われる
1.要素数で比較
(要素数の少ない配列がより小さい)
2.要素数が等しい場合、同じキーを持つ要素同士で値の大小を比較
(差異があったところで判定を終了)
3.1と2の比較がすべて等しい場合、両者は等しいとされる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php $ary1 = array(1,2,3); $ary2 = array(100,1000); var_dump($ary1 < $ary2); //bool(false) 要素数で比較 $ary3 = array(1,2,3); $ary4 = array(1,3,2); var_dump($ary3 < $ary4); //bool(true) キー[2]の値で比較 $ary5 = array(1,2,3); $ary6 = array(1,2,'3'); var_dump($ary5 == $ary6); //bool(true) 文字列が数値に変換されている var_dump($ary5 === $ary6); //bool(false) 文字列は数値に変換されない $ary7 = array('A' => 'a','B' => 'b','C' => 'c'); $ary8 = array('A' => 'a','C' => 'c','B' => 'b'); var_dump($ary7 == $ary8); //bool(true) 並び順は判定に関係しない var_dump($ary7 === $ary8); //bool(false) 並び順も判定に関係する ?> |
条件演算子(?:)
条件演算子は、指定された条件式の真偽に応じて、対応する式の値を出力する
条件式 ? 式1 : 式2
1 2 3 4 |
<?php $score = 75; print $score >=70 ? '合格!' : '不合格…' ; //結果: 合格! ?> |
if命令よりもシンプルに記述できる
PHP5.3~は、省略構文も使用できるようになった
式1 ?: 式2
式1がTRUEに変換できる場合は、式1
そうでない場合は、式2を出力する
1 2 3 4 |
<?php $message = ''; print $message ?: '空です。'; //結果: 空です。 ?> |
※空白文字列は、FALSEと認識されるため、「空です」が出力される
論理演算子
論理演算子は、複数の条件式(または真偽値)を論理的に結合し、その結果をTRUE/FALSEとして返す
比較演算子と組み合わせて使用する
※$x = TRUE, $y = FALSE
&& | 論理積。左右の式が両方ともにTRUEの場合、TRUE | $x && $y // FALSE |
and | 論理積。左右の式が両方ともにTRUEの場合、TRUE | $x and $y // FALSE |
|| | 論理和。左右の式のいずれかがTRUEの場合、TRUE | $x || $y // TRUE |
or | 論理和。左右の式のいずれかがTRUEの場合、TRUE | $x or $y // TRUE |
xor | 排他的論理和。左右の式のいずれかがTRUE、かつ両方ともがTRUEではない場合にTRUE | $x xor $y // TRUE |
! | 否定。式がTRUEの場合はFALSE、FALSEの場合はTRUE | ! $x //FALSE |
ショートカット演算(短絡演算)
論理積、論理和において、ある条件下で、左式だけが評価され右式が評価されないことがある
これをショートカット演算(短絡演算)という
例えば、
$i = 1;
$i == 5 && $j == 10
の場合、左式($ == 5)がFALSEなので、式全体はFALSEとなり、右式($j == 10)は評価されない
同様に、
$i = 1;
$ == 1 || $j == 10
の場合も、左式($ == 1)がTRUEなので、式全体がTRUEとなり、右式($j == 10)は評価されない
この性質(ショートカット)があるため、以下のコードもありうる
1 2 3 4 5 |
<?php $x = 1; if($x != 2){print '実行されました。<br>';} //実行されました。---A $x == 2 or print '実行されました。'; //実行されました。---B ?> |
Aは「$x != 2 がTRUEの場合、メッセージを表示する」という意味、
Bは「$x ==2 がFALSEの場合、メッセージを表示する」という意味で、つまりAとBは等価である
(仮に、$x = 2; であった場合、A、Bともにメッセージは表示されない)
Bのコードは、一部の例外を除いて使用しない
ビット演算子
ビットは2進数の桁のこと
10進数→2進数で演算→10進数で返る
& | 論理積。左式/右式の双方にセットされているビット(桁)をセットする | 10 & 1 //0 (1010 & 0001 →0000 → 0) |
| |
論理和。左式/右式のいずれかにセットされているビットをセットする |
10 & 1 // 11 (1010 | 0001 → 1011 → 11) |
^ | 排他的論理和。左式/右式のいずれかでセットされていて、かつ、 双方にセットされていないビットをセット |
10 ^ 1 // 11 (1010 ^ 0001 → 1011 → 11) |
~ | 否定。ビットを反転 | ~10 // -11 (1010 → 0101 → -11) |
<< | ビットを左にシフト | 10 << 1 // 20 (1010 → 10100 → 20) |
>> | ビットを右にシフト | 10 << 2 // 5 (1010 → 0101 → 5) |
ビットシフト演算は、左にシフトすれば2倍、右にシフトすれば1/2倍となる
その他の演算子
文字列演算子
文字列演算子(.)は、左式/右式の文字列を連結する
1 2 3 4 5 |
<?php $w = 'はじめまして、'; $x = '山田太郎です。'; print $w . $x; //結果: はじめまして、山田太郎です。 ?> |
オペランド(値)が数値リテラルの場合…
1 2 3 4 5 |
<?php $i = 0xFF; //0x(接頭辞) + 255(16進数) $j = 1.5E2; //1.5 * 10²(指数表現) print $i . $j; //結果: 255150 ?> |
16進数表現や指数表現は、変数に入れられた時点で10進数として扱われるため、255150となる
実行演算子
実行演算子(`)は、バッククォートで囲ったブロックをシェルコマンドとして実行する
1 2 3 4 |
<?php $result = `dir`; print mb_convert_encoding($result,'UTF-8','SJIS'); ?> |
実行結果:
ドライブ D のボリューム ラベルがありません。 ボリューム シリアル番号は A83F-442E です
(略)
※dirコマンドは、現在のフォルダのファイルリストを表示するコマンド
Linuxでは、「ls」を使う
エラー制御演算子
エラー制御演算子(@)は、特定の式の先頭に付加することで、その命令で発生したエラーメッセージを抑制する
1 2 3 4 |
<?php print 1/0; // Warning: Division by zero in… @print 1/0; // 何も表示されない ?> |
できるだけ使うべきではない
演算子の優先順位と結合則
複雑な式の場合、演算子がどのような順序で処理されるか、理解しておく必要がある
優先順位
すべての演算子の優先順位を覚える必要はない
複雑な式を書く場合には丸カッコを利用する
丸カッコで囲まれた式は最優先で処理される
1 2 3 4 |
<?php $i = 1 + 2 * 3 + 4; // 11 $j = (1 + 2) * (3 + 4); // 21 ?> |
結合則
結合則とは、同じ優先順位の演算子を処理する順序のこと
優先順位が同じ演算子が並んでいる時に、演算子を左から右、右から左のいずれかの方向に処理するかを決める
左結合
|
算術演算子 | ++, –, *, /, %, +, – |
---|---|---|
ビット演算子 | <<, >>, &, ^, | | |
論理演算子 | &&, ||, and, xor, or | |
条件演算子 | ?: | |
その他 | [], .(ドット), ,(カンマ) | |
右結合 | 論理演算子 | ! |
代入演算子 | =, +=, -=, *=, /=, .=, %=, &=, |=, ^=, <<=, >>= | |
非結合 | 比較演算子 | <, <=, >, >=, <>, ==, !=, ===, !== |
その他 | clone, new, ~, -, (int), (float), (string), (array), (object), (bool), @, instanceof |