演算子 ー ゼロから始めるPHP入門(PHP7)【Vol.6】
今回は基本となる演算子をまとめていきます。演算子はデータに対して処理をおこなう記号です。講座の中でもすでに代入演算子「=
」が登場しました。
代数演算子
整数型や浮動小数点数型を計算するときに使う演算子です。
Atomを起動して、新規ファイルを作ります。「PHPの実行」で作った[php-study]フォルダ内に「sample6-1.php」として保存します。「PHPの実行」と同じようにHTMLのコードをAtomで生成させて、body要素内に以下のコードを書きます。Apacheを起動して、ChromeからPHPを実行してください。
※PHPの実行方法の詳しい手順は「PHPの実行」をご覧ください。これ以降のコードに関しても任意のファイル名で作成して、実際にPHPを実行しながら読む進めていってください。
<?php echo 3 + 3; echo ""<br>""; echo 4 * 3; echo ""<br>""; echo 5 - 1; echo ""<br>""; echo 6 / 2; echo ""<br>""; echo 12 % 5; echo ""<br>""; echo 3 ** 3; ?>
実行結果:
6 12 4 3 2 27
*
は掛け算、/
は割り算、%
は割った余りの数、**
は累乗です。3 ** 3
は3の3乗です。
足し算と掛け算が混ざった場合、掛け算が優先されて先に演算されます。
echo 3 + 3 * 6;
実行結果:
21
ただし上記のコードは、
echo 3 + (3 * 6);
と丸括弧を書いて優先順位を明確にすることがほとんどです。
代数演算子の暗黙の型変換
整数型や浮動小数点数型以外のデータ型に代数演算子を適用することができます。この場合、データ型は整数型や浮動小数点数型に型変換されて計算されます。
<?php echo ""1"" + ""4""; echo ""<br>""; echo ""1"" + 3; echo ""<br>""; echo ""5abc"" + 3; echo ""<br>""; echo ""abc5"" + 3; echo ""<br>""; echo true + 1; echo ""<br>""; echo false + 1; ?>
5 4 Notice: A non well formed numeric value encountered in /Applications/XAMPP/xamppfiles/htdocs/php-study/sample6-1.php on line 13 8 Warning: A non-numeric value encountered in /Applications/XAMPP/xamppfiles/htdocs/php-study/sample6-1.php on line 15 3 2 1
2ヶ所注意・警告が出ています。
echo ""5abc"" + 3;
の""5abc""
は5に変換されて計算されますが、Noticeエラーで出ています。「A non well formed numeric value encountered in」となっているので十分に数字に変換できない値に出会いましたという注意です。
""abc5"" + 3;
の""abc5""
は0に変換されて計算されますが、Warningエラーで出ています。「A non-numeric value encountered in」となっているので、数字に変換できない値に出会いましたという警告です。
どちらも注意・警告を出しながらも、PHPは無理やり文字列型を整数型に型変換して計算しています。
true + 1;
の論理型のtrue
は1に変換され、false
は0に変換され計算されます。
文法エラーの場合、Parse errorとなりスクリプトは実行されません。他にも実行時エラーであるFatal errorがあります。これは実行が中断されます。
代入演算子
代入演算子は右側のデータを展開して、左側の変数に代入する演算子です。
<?php $num = 5; echo $num; ?>
実行結果:
5
この例の場合、右側の5
は整数リテラルなので、これ以上展開はされ図、5
のまま、左側の変数に代入されます。
$num = 5; $num2 = $num; echo $num2;
実行結果:
5
この場合、$num2 = $num;
に注目してください。右側の$num
変数は展開され、中身の5に置き替わります。そして展開された5
が、左側の変数に代入されます。
比較演算子
比較演算子は、左右のデータを比較してtrue
かfalse
に置き換わる演算子です。
<?php var_dump(5 === 5); var_dump(5 === ""5""); var_dump(5 == 5); var_dump(5 == ""5""); ?>
実行結果:
bool(true) bool(false) bool(true) bool(true)
===
は左右のデータ型が等しく、値も等しいときにtrue
に置き換わる演算子です。5 === ""5""
は、データ型が違うため、false
に置き換わっています。
==
は左右の値が等しいときにtrue
に置き換わる演算子です。暗黙で型変換をします。5 == ""5""
の場合、右側の""5""
が5
に変換され比較されます。
var_dump(5 == ""5abc""); var_dump(0 == ""abc"");
実行結果:
bool(true) bool(true)
""5abc""
は5
に変換され、""abc""
は0
に変換され、どちらもtrue
に置き替わります。
ただし==
のバグの温床になりますので、まったく使わないようにしてください。
<?php var_dump(5 !== 5); var_dump(5 !== 6); var_dump(5 !== ""5""); var_dump(5 != ""5""); ?>
実行結果:
bool(false) bool(true) bool(true) bool(false)
!==
はデータ型が等しくなく、値も等しくないときにtrue
に置き替わります。!=
は、値が等しくないときにtrue
に置き替わります。!=
は暗黙の型変換を行います。5 != ""5""
の""5""
は、5
に展開され、5 != 5
となり、等しいのでfalse
に置き替わります。
<?php var_dump(5 < 5); var_dump(5 < 6); var_dump(5 > 6); var_dump(5 <= 5); var_dump(5 <> 3); var_dump(5 <> 5); ?>
実行結果:
bool(false) bool(true) bool(false) bool(true) bool(true) bool(false)
<>
は等しくないときに、true
に置き換わリます。!=
と同じで暗黙の型変換をするので、注意が必要です。
宇宙船演算子
<?php var_dump(5 <=> 5); var_dump(6 <=> 5); var_dump(5 <=> 6); ?>
実行結果:
int(0) int(1) int(-1)
$a <=> $b
は、PHP7から導入された比較演算子です。$aが$bより小さいときに-1、$bと等しいときに0、 $bより大きいときに1に置き替わります。宇宙船演算子と名前がついています。
論理演算子
<?php var_dump(50 === 50 && 40 > 30); var_dump(50 === 50 && 40 > 50); var_dump(50 === 30 && 40 > 50); ?>
実行結果:
bool(true) bool(false) bool(false)
&&
は、まず左側の式を評価して、true
かfalse
かを判定します。もしtrue
であれば、右側の式を評価してtrue
かfalse
かを判定します。右側もtrue
であれば、true
に置き替わります。
左側の式がtrue
でも、右側の式がfalse
であれば、false
に置き替わります。
50 === 30 && 40 > 50)
のように、左側の式がflase
の場合は、右側の式は実行されず、false
に置き替わります。この仕様は短絡評価と呼ばれます。
<?php var_dump(50 === 50 || 40 > 30); var_dump(50 === 30 || 60 > 50); var_dump(50 === 30 || 40 > 50); ?>
実行結果:
bool(true) bool(true) bool(false)
||
は、まず左側の式を評価して、true
かfalse
かを判定します。もしtrue
であれば、右側の式は実行せずtrue
に置き替わります。短絡評価です。
左側の式がfalse
の場合、ようやく右側の式が調べられます。右側の式がtrue
であれば、||
はtrue
に置き替わります。右側の式もfalse
であれば、||
はfalse
に置き替わります。
今回は演算子のごくごくベーシックなところだけをおさえました。
その他の演算子やポイントは多くありますが、必要に応じて取り上げていきます。