計算する


代数演算子

式文は、PHP のプログラムの中で最も基本的な文です。 プログラム中の大部分は、この式文で構成されます。 式文は複数の式で構成される文です。

とは、何らかの値の結果を返す要素のことで、リテラルや変数は最も単純な式です。 リテラルも変数も、それ単体で何らかの結果を返します。

計算は、式を項として演算子によって接合します。 演算子は、ひとつ以上の式を項として受け取り、それに対して何らかの処理を行い結果を返します。 最も基本的な演算子は、加算、減算、乗算。除算、剰余を行う演算子でしょう。 これらを用いれば、基本的な計算を行うことができます。

演算子結果
式1 + 式2式1と式2を加算した値
式1 - 式2式1から式2を引いた値
式1 * 式2式1と式2をかけた値
式1 / 式2式1を式2で割った値
式1 % 式2式1を式2で割った余りの値

例えば 10 + 5 や、$var1 * 3 など、変数や定数は式なのでこのような文は問題ありません。 さらに、演算子の結果は値であることから、演算子の結果を式として扱うことができます。 より複雑な (1 + 2) * $var という計算も可能です。 この場合、(1 + 2) が式であると解釈することができ、括弧で括った式が優先して計算されます。

<?php
	$var1 = 10 + 20;
	$var2 = $var1 * 10;
	$var3 = ($var2 - 100) / 2;
	echo "\$var2 = $var2\n\$var3 = $var3";
?>

このプログラムでは、定数や変数を演算子で計算させて、その結果を代入演算子によって変数に保存させています。 このプログラムを実行すれば、正しく演算が行われているかどうかを確認できます。 これらの代数演算は、数学と同じなので難しいものではありません。


ビット演算子

ビット演算子は整数中の特定のビットを操作することができる演算子です。 コンピュータの内部ではあらゆる情報が2進数で表現されているため、ビット単位の情報を操作することでより細かいデータ処理が可能となります。 例えば、整数中の特定のビットを取得したり、変換することができるようになります。

演算子結果
式1 & 式2式1と式2の論理積
式1 | 式2式1と式2の論理和
式1 ^ 式2式1と式2の排他的論理和
~ 式のビットを全て反転させた値
式1 << 式2式1のビットを左に式2だけシフトした値
式1 >> 式2式1のビットを右に式2だけシフトした値

論理積は、対応するビットが両方とも 1 であれば 1、そうでなければ 0 を結果とします。 論理和は、対応するビットのいずれかが 1 であれば 1、両方とも 0 であれば 0 を結果とします。 排他的論理和は、対応するビットが異なれば 1、そうでなければ 0 を結果とします。

~ は2項ではなく単項演算子で、指定された式の値のビットフラグを全て反転させます。 例えば 1111 0000 であれば 0000 1111 を結果として返します。

<?php
	echo "1 & 1 = " , 1 & 1 , "\n";
	echo "1 & 0 = " , 1 & 0 , "\n";
	echo "0 & 1 = " , 0 & 1 , "\n";
	echo "0 & 0 = " , 0 & 0 , "\n\n";

	echo "1 | 1 = " , 1 | 1 , "\n";
	echo "1 | 0 = " , 1 | 0 , "\n";
	echo "0 | 1 = " , 0 | 1 , "\n";
	echo "0 | 0 = " , 0 | 0 , "\n\n";

	echo "1 ^ 1 = " , 1 ^ 1 , "\n";
	echo "1 ^ 0 = " , 1 ^ 0 , "\n";
	echo "0 ^ 1 = " , 0 ^ 1 , "\n";
	echo "0 ^ 0 = " , 0 ^ 0 , "\n\n";

	echo "~1 = " , ~1 , "\n";
	echo "~0 = " , ~0;
?>

このプログラムは、各ビットごとの論理演算子の効果を調べます。 このプログラムでは2進数の一桁目のみが対象になっていますが、実際にはもっと大きな数で演算されるでしょう。 例えば、10 & 12 であれば、2進数の 1010 & 1100 で考えて 1000 すなわち 8 という結果が得られます。

ビットシフトは、ビット列を単純に左右に動かします。 左に 1 回シフトする場合は 2 で乗算、右に 1 回シフトする場合は 2 で除算する結果と同じになります。 シフトによって空白となる部分は 0 で初期化され、溢れてしまう最上位、または最下位のビットは消えてなくなります。 例えば 11001010 を左に 2 回シフトすれば 00101000 となります。

<?php
	echo "8 << 1 = " , 8 << 1 , "\n";
	echo "8 << 2 = " , 8 << 2 , "\n";
	echo "8 >> 1 = " , 8 >> 1 , "\n";
	echo "8 >> 2 = " , 8 >> 2 , "\n\n";

	echo "-4 << 1 = " , -4 << 1 , "\n";
	echo "-4 >> 1 = " , -4 >> 1 , "\n";
?>

このプログラムは、左、及び右シフト演算子の効果を確認します。 負数の場合も、符号ビットはそのままでシフトが行われます。


加算子と減算子

加算子と減算子は、一般にインクリメント演算子、デクリメント演算子とも呼ばれる演算子で、変数に対してのみ作用する演算子です。 加算子は変数の内容に 1 を加算し、減算子は変数の内容から 1 を減算します。 双方とも、1 つの変数だけを項として受ける単項演算しです。

演算子結果
++変数変数に 1 を加え、変数の値を返す
変数++変数の値を返し、変数に 1 を加える
--変数変数から 1 を引き、変数の値を返す
変数--変数の値を返し、変数から 1 を引く

双方の演算子はともに、変数の前に置く前置と、変数の後に置く後置があり、それぞれ異なる効果を持ちます。 前置の場合は変数を操作した後に変数の値を返しますが、後置の場合は結果となる値は変数が操作される前の値となります。

<?php
	$var = 1;
	echo "++\$var = " , ++$var , "\n";
	echo "\$var = $var\n\n";
	echo "\$var++ = " , $var++ , "\n";
	echo "\$var = $var\n\n";
	echo "--\$var = " , --$var , "\n";
	echo "\$var = $var\n\n";
	echo "\$var-- = " , $var-- , "\n";
	echo "\$var = $var\n\n";
?>

このプログラムは、前置と後置のそれぞれの加算子と減算子の効果を調べるためのプログラムです。 各 echo では、加算子と減算子の結果と、その後の変数の値の推移を表示しています。


比較演算子

比較演算子は、2 つの式の値の関係がどのようなものかを調べるための演算子です。 この演算子の目的は、主にプログラムのロジックで分岐判断を行うための情報を得ることです。 値が等しいかどうか、大きいか小さいかなどを判断します。

演算子結果
式1 == 式2式1が式2に等しければ TRUE
式1 === 式2式1が式2に等しく、同じ型であれば TRUE
式1 != 式2式1が式2に等しくなければ TRUE
式1 <> 式2式1が式2に等しくなければ TRUE
式1 !== 式2式1が式2に等しくないか、同じ型でなければ TRUE
式1 < 式2式1が式2より小さければ TRUE
式1 > 式2式1が式2より大きければ TRUE
式1 <= 式2式1が式2より少ないか等しければ TRUE
式1 >= 式2式1が式2より大きいか等しければ TRUE

これらの演算子が返す結果は論理型 boolean です。 比較した結果が TRUE であるか FALSE であるかを調べることによって、値の関係を把握することができます。

<?php
	echo "10 == 10 : " , 10 == 10 , "\n";
	echo "10 == 5 : " , 10 == 5 , "\n";

	echo "10 != 5 : " , 10 != 5 , "\n";
	echo "10 != 10 : " , 10 != 10 , "\n";

	echo "10 <> 5 : " , 10 <> 5 , "\n";
	echo "10 <> 10 : " , 10 <> 10 , "\n";
	
	echo "10 < 100 : " , 10 < 100 , "\n";
	echo "10 < 1 : " , 10 < 1 , "\n";

	echo "10 > 1 : " , 10 > 1 , "\n";
	echo "10 > 100 : " , 10 > 100 , "\n";
?>

このプログラムは、主な比較演算子の効果を確認することができます。 比較した結果が TRUE であれば 1 として表示され、そうでなければ何も表示されません。


論理演算子

ビット演算の関係のように、論理型同士で論理積や論理和を求めるには論理演算子を用います。 この演算子によって、例えば複数の比較演算子の結果をさらに組み合わせることができるようになります。 比較演算子の結果が双方ともに TRUE であれば TRUE、というような処理に必要となるでしょう。

演算子結果
式1 and 式2式1と式2が共に TRUE であれば TRUE
式1 or 式2式1と式2のいずれかが TRUE であれば TRUE
式1 xor 式2式1と式2のどちらかがTRUEでかつ両方ともTRUEでない場合にTRUE
!式が TRUE でなければ TRUE
式1 && 式2式1と式2が共に TRUE であれば TRUE
式1 || 式2式1と式2のいずれかが TRUE であれば TRUE

PHP の論理演算では、同じ論理積でも and と &&、論理和でも or と || という書き方があります。 これらの演算子の効果は同じですが、優先順位が異なります。 同じ文の中に記述された場合 and や or が優先され && や || の優先順位は低く設定されています。 例えば $a and $b && $c and $d というような計算を行うことができます。 ただし、これは ($a && $b) && ($c && $d) とも記述できます。

<?php
	echo "TRUE and TRUE = " , TRUE and TRUE , "\n";
	echo "TRUE and FALSE = " , TRUE and FALSE , "\n";
	echo "FALSE and TRUE = " , FALSE and TRUE , "\n";
	echo "FALSE and FALSE = " , FALSE and FALSE , "\n\n";

	echo "TRUE or TRUE = " , TRUE or TRUE , "\n";
	echo "TRUE or FALSE = " , TRUE or FALSE , "\n";
	echo "FALSE or TRUE = " , FALSE or TRUE , "\n";
	echo "FALSE or FALSE = " , FALSE or FALSE , "\n\n";

	echo "TRUE xor TRUE = " , TRUE xor TRUE , "\n";
	echo "TRUE xor FALSE = " , TRUE xor FALSE , "\n";
	echo "FALSE xor TRUE = " , FALSE xor TRUE , "\n";
	echo "FALSE xor FALSE = " , FALSE xor FALSE , "\n\n";

	echo "!TRUE = " , !TRUE , "\n";
	echo "!FALSE = " , !FALSE;
?>

このプログラムを実行すると、論理演算子の機能を確認することができます。 結果が TRUE であれば 1 と表示され、FALSE であれば空文字に変換されるため結果は表示されません。


文字列連結演算子

文字列の結合は、文字列連結演算子 . を使います。

文字列1 . 文字列2

この演算子は、左項と右項の文字列を単純に結合した結果を返します。

<?php
	echo "Kitty on " . "your lap";
?>

このプログラムは、文字列連結演算子によって文字列を結合し、文字列を繋げた "Kitty on your lap" という文字列が表示されます。


複合代入演算

複合代入演算は、変数と式を組み合わせた演算子で、代数演算やビット演算、文字列連結演算を行うと同時に変数にその結果を保存するという演算子です。 複合代入演算は次のように記述します。

変数 op=

op には、+ や - などの任意の演算子を指定します。 例えば、変数 $var の値に 10 を加算し、その結果を $var に保存するというプログラムを記述する場合、複合代入演算で $var += 10 と記述できます。 これは $var = $var + 10 と同じです。



前のページへ戻る次のページへ