[PHPのはじめ方] Part6: 演算子と型の変換

はじめに

PHPでプログラミングをする上で、計算したり、値を比較したり、文字列を連結したりすることは基本中の基本です。これらを行うために使われるのが「演算子」です。また、PHPは柔軟な型システムを持っていますが、時には意図的にデータの型を変換する必要もあります。このステップでは、PHPの様々な演算子と型の変換について学びましょう!😊

PHPの演算子

演算子は、値に対して何らかの操作を行うための記号です。PHPにはたくさんの種類の演算子があります。ここでは主要なものを紹介します。

算術演算子

数値計算に使われる基本的な演算子です。

演算子 名前 結果
+ 加算 $a + $b $a と $b の和
- 減算 $a - $b $a と $b の差
* 乗算 $a * $b $a と $b の積
/ 除算 $a / $b $a を $b で割った商
% 剰余 $a % $b $a を $b で割った余り
** べき乗 (PHP 5.6以降) $a ** $b $a の $b 乗
<?php
$a = 10;
$b = 3;

echo $a + $b; // 13
echo "<br>";
echo $a % $b; // 1
echo "<br>";
echo $a ** $b; // 1000
?>

代入演算子

変数に値を代入するための演算子です。右辺の値を左辺の変数に設定します。算術演算子と組み合わせて使うこともできます。

演算子 意味
= $a = $b $a に $b の値を代入する
+= $a += $b $a = $a + $b と同じ
-= $a -= $b $a = $a - $b と同じ
*= $a *= $b $a = $a * $b と同じ
/= $a /= $b $a = $a / $b と同じ
%= $a %= $b $a = $a % $b と同じ
**= $a **= $b $a = $a ** $b と同じ (PHP 5.6以降)
.= $a .= $b $a = $a . $b と同じ (文字列連結)
<?php
$x = 10;
$y = 5;
$x += $y; // $x は 15 になる
echo $x;
echo "<br>";

$text = "こんにちは";
$text .= "、世界!"; // $text は "こんにちは、世界!" になる
echo $text;
?>

比較演算子

2つの値を比較し、結果を真偽値(true または false)で返します。条件分岐などでよく使われます。

演算子 名前 結果
== 等しい $a == $b $a と $b の値が等しければ true (型は比較しない)
=== 完全に等しい (同一) $a === $b $a と $b の値とが両方等しければ true
!= 等しくない $a != $b $a と $b の値が等しくなければ true (型は比較しない)
<> 等しくない $a <> $b != と同じ
!== 完全に等しくない (同一でない) $a !== $b $a と $b の値またはが異なれば true
< より小さい $a < $b $a が $b より小さければ true
> より大きい $a > $b $a が $b より大きければ true
<= 以下 $a <= $b $a が $b 以下であれば true
>= 以上 $a >= $b $a が $b 以上であれば true
<=> 宇宙船演算子 (PHP 7以降) $a <=> $b $a < $b なら -1, $a == $b なら 0, $a > $b なら 1 を返す
注意: ===== の違いは非常に重要です! == は比較前に型の自動変換(型ジャグリング)を行うため、予期せぬ結果になることがあります。例えば 5 == "5"true になりますが、5 === "5"false です。可能な限り ===!== を使うことをお勧めします。⚠️
<?php
$num = 5;
$str = "5";

var_dump($num == $str);  // bool(true)
var_dump($num === $str); // bool(false)

$a = 10;
$b = 20;
var_dump($a <=> $b); // int(-1)
?>

論理演算子

複数の条件を組み合わせて評価する際に使います。

演算子 名前 結果
and / && 論理積 (AND) $a and $b
$a && $b
$a と $b が両方 true なら true
or / || 論理和 (OR) $a or $b
$a || $b
$a または $b のどちらか一方でも true なら true
xor 排他的論理和 (XOR) $a xor $b $a または $b のどちらか一方だけが true なら true
! 否定 (NOT) !$a $a が false なら true, true なら false
補足: and&&or|| はほとんど同じ働きをしますが、演算子の優先順位が異なります。一般的には &&|| がよく使われます。
<?php
$is_admin = true;
$is_active = false;

if ($is_admin && $is_active) {
  echo "管理者でアクティブです。";
} elseif ($is_admin || $is_active) {
  echo "管理者 または アクティブです。"; // こちらが出力される
}

if (!$is_active) {
  echo "アクティブではありません。"; // こちらも出力される
}
?>

インクリメント/デクリメント演算子

変数の値を1増やしたり(インクリメント)、1減らしたり(デクリメント)します。変数の前につけるか後につけるかで、値を返すタイミングが異なります。

演算子 名前 説明
++$a 前置インクリメント echo ++$a; $a を1増やしてから、$a の値を返す
$a++ 後置インクリメント echo $a++; $a の元の値を返してから、$a を1増やす
--$a 前置デクリメント echo --$a; $a を1減らしてから、$a の値を返す
$a-- 後置デクリメント echo $a--; $a の元の値を返してから、$a を1減らす
<?php
$count = 5;
echo ++$count; // 6 (増やしてから出力)
echo "<br>";
echo $count;   // 6

$count = 5;
echo $count++; // 5 (出力してから増やす)
echo "<br>";
echo $count;   // 6
?>

文字列演算子

文字列を連結するために使います。

演算子 名前 結果
. 連結 $a . $b 文字列 $a と 文字列 $b を連結した新しい文字列
.= 連結代入 $a .= $b $a = $a . $b と同じ
<?php
$first_name = "山田";
$last_name = "太郎";
$full_name = $first_name . $last_name; // "山田太郎"
echo $full_name;

$message = "今日の天気は";
$message .= "晴れです。"; // "今日の天気は晴れです。"
echo "<br>" . $message;
?>

その他の演算子

他にも様々な演算子があります。

  • 配列演算子 (+, ==, ===, !=, <>, !==): 配列同士の結合や比較に使います。
  • エラー制御演算子 (@): 式の実行時に発生するエラー出力を抑制します。デバッグが困難になる可能性があるため、使用は慎重に行いましょう。
  • 実行演算子 (`` バッククォート): シェルコマンドを実行します。セキュリティリスクがあるため、通常は使いません。shell_exec()などの関数を使う方が安全です。
  • 型演算子 (instanceof): オブジェクトが特定のクラスのインスタンスかどうか、または特定のインターフェースを実装しているかを調べます。(オブジェクト指向の章で詳しく学びます)
  • Null合体演算子 (??) (PHP 7以降): 変数が存在し、かつ null でない場合にその値を返し、そうでなければ右辺の値を返します。isset() と三項演算子を組み合わせたような動作を簡潔に書けます。
  • 三項演算子 (? :): 条件式の結果に応じて2つの値のどちらかを選択します。(条件) ? (真の場合の値) : (偽の場合の値)
<?php
// Null合体演算子
$username = $_GET['user'] ?? 'guest'; // $_GET['user'] が存在しnullでなければその値、そうでなければ 'guest'
echo "ユーザー名: " . htmlspecialchars($username); // XSS対策でhtmlspecialcharsを使用
echo "<br>";

// 三項演算子
$age = 25;
$status = ($age >= 20) ? '成人' : '未成年';
echo "ステータス: " . $status; // 成人
?>

型の変換 (キャスト)

PHPは「弱い型付け言語」と呼ばれ、文脈に応じて自動的に型を変換してくれることがあります。これを「型ジャグリング」と呼びます。便利な反面、意図しない動作の原因にもなり得ます。

<?php
$num_string = "10";
$num_int = 5;

// 文字列が数値として扱われ、計算される
$result = $num_string + $num_int; // 15 (文字列 "10" が整数 10 に変換された)
var_dump($result); // int(15)

// 数値が文字列として扱われ、連結される
$message = "合計は: " . $result;
echo $message; // 合計は: 15
?>

自動的な型変換に頼るのではなく、意図的に型を変換したい場合は「キャスト」を使います。変数名の前に括弧で囲んだ型名を書くことで、その型に変換しようと試みます。

キャスト演算子 変換後の型
(int), (integer) 整数 (integer)
(bool), (boolean) 真偽値 (boolean)
(float), (double), (real) 浮動小数点数 (float)
(string) 文字列 (string)
(array) 配列 (array)
(object) オブジェクト (object)
(unset) NULL (PHP 7.2.0 以降で非推奨)
<?php
$score_str = "100";
$score_int = (int)$score_str; // 文字列を整数にキャスト
var_dump($score_int); // int(100)

$flag_int = 1;
$flag_bool = (bool)$flag_int; // 整数を真偽値にキャスト (0以外はtrue)
var_dump($flag_bool); // bool(true)

$price = 12.8;
$price_int = (int)$price; // floatを整数にキャスト (小数点以下切り捨て)
var_dump($price_int); // int(12)

$user_id = 123;
$user_id_str = (string)$user_id; // 整数を文字列にキャスト
var_dump($user_id_str); // string(3) "123"
?>

また、settype() 関数を使って、変数の型を直接変更することもできます。

<?php
$value = "55.5";
echo gettype($value); // string
echo "<br>";

settype($value, "float"); // $value の型を float に変更
echo gettype($value); // double (floatの内部表現)
echo "<br>";
var_dump($value); // float(55.5)
?>
注意: すべての値が期待通りに変換できるわけではありません。例えば、文字列 “abc” を (int) でキャストすると 0 になります。変換ルールは PHPマニュアルの型ジャグリング や各型のページで確認しましょう。🤔

まとめ

今回は、PHPの様々な演算子と型の変換について学びました。

  • 演算子は、計算、代入、比較、論理演算など、プログラミングの基本的な操作を行います。特に比較演算子 ===== の違いは重要です。
  • 型の変換は、PHPが自動で行う場合(型ジャグリング)と、キャスト演算子 (int) などを使って明示的に行う場合があります。意図しない動作を避けるため、型を意識したプログラミングを心がけましょう。

これらの知識は、これからのPHPプログラミングの基礎となります。たくさんのコードを書いて、演算子や型の扱いに慣れていきましょう!💪