[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プログラミングの基礎となります。たくさんのコードを書いて、演算子や型の扱いに慣れていきましょう!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です