タイトルイメージ

[Memo]PHP<演算子> 2015.08.31

Memo

ここでは『独習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を加算する

 配列の結合

加算演算子(+)で配列を結合する

 実行結果:
Array ( [0] => 1 [1] => 3 [2] => 5 [3] => 7 )

通常配列の場合、インデックス番号が重複した場合は、後の値は無視される
そして、新たなインデックス番号の値だけが結合される

→通常配列の場合は、array_merge命令を利用する

 実行結果:
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)に影響はない

 一方、参照(リファレンス)による代入($x = 1; $y =& $x;)の場合、
元の変数($x)と代入された変数($y)は同じアドレス(コンピュータ内のメモリ)にあるため、元の変数に対する変更($x = 5;)は、代入された変数($y)にも及ぶ

 参照による代入には「=&」を使う
代入演算子「&=」とは別物

比較演算子

左辺と右辺を比較し、その結果を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.1と2の比較がすべて等しい場合、両者は等しいとされる

条件演算子(?:)

条件演算子は、指定された条件式の真偽に応じて、対応する式の値を出力する
条件式 ? 式1 : 式2

 if命令よりもシンプルに記述できる
PHP5.3~は、省略構文も使用できるようになった
式1 ?: 式2
式1がTRUEに変換できる場合は、式1
そうでない場合は、式2を出力する

 ※空白文字列は、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)は評価されない

この性質(ショートカット)があるため、以下のコードもありうる

 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)

bit

ビットシフト演算は、左にシフトすれば2倍、右にシフトすれば1/2倍となる

その他の演算子

文字列演算子

文字列演算子(.)は、左式/右式の文字列を連結する

 オペランド(値)が数値リテラルの場合…

 16進数表現や指数表現は、変数に入れられた時点で10進数として扱われるため、255150となる

実行演算子

実行演算子(`)は、バッククォートで囲ったブロックをシェルコマンドとして実行する

 実行結果:
ドライブ D のボリューム ラベルがありません。 ボリューム シリアル番号は A83F-442E です
(略)

※dirコマンドは、現在のフォルダのファイルリストを表示するコマンド
Linuxでは、「ls」を使う

エラー制御演算子

エラー制御演算子(@)は、特定の式の先頭に付加することで、その命令で発生したエラーメッセージを抑制する

 できるだけ使うべきではない

演算子の優先順位と結合則

複雑な式の場合、演算子がどのような順序で処理されるか、理解しておく必要がある

優先順位

priority

すべての演算子の優先順位を覚える必要はない
複雑な式を書く場合には丸カッコを利用する
丸カッコで囲まれた式は最優先で処理される

結合則

結合則とは、同じ優先順位の演算子を処理する順序のこと
優先順位が同じ演算子が並んでいる時に、演算子を左から右、右から左のいずれかの方向に処理するかを決める

左結合

 

算術演算子 ++, –, *, /, %, +, –
ビット演算子 <<, >>, &, ^, |
論理演算子 &&, ||, and, xor, or
条件演算子 ?:
その他 [], .(ドット), ,(カンマ)
右結合 論理演算子 !
代入演算子 =, +=, -=, *=, /=, .=, %=, &=, |=, ^=, <<=, >>=
非結合 比較演算子 <, <=, >, >=, <>, ==, !=, ===, !==
その他 clone, new, ~, -, (int), (float), (string), (array), (object), (bool), @, instanceof

 

コメントを残す

メールアドレスが公開されることはありません。コメントのみの投稿も可能です。

TOPページへ戻る

About

Creator Indexは、Webクリエーター初心者に役立つブログを目指しています。
執筆者自身が日々学んだ内容をアップしていきます。

Author

筆者イメージ

Jun

サイトリニューアルを計画中…