データを扱う基本要素(データを入れて使うための仕組み)
プログラムは“手順書”であると同時に、データを扱ってはじめて便利なことができるようになります。
- 情報をどこかに保持しておく
- 必要なときに取り出す
- 必要に応じて書き換える
- 計算したり、比較したりして判断する
こういったことができて、ようやく「ちゃんと使えるアプリ」を作れるようになります。
では、そのデータとは一体なんなのか?を、以下で説明していきます。
変数・定数と型(データを入れる箱の種類とルール)
先ほどの条件分岐の説明でこのコードを見てもらいましたよね。
<?php
$drink = "milk";
//これは、$drinkという名前の箱(変数)に「milk(牛乳)」というデータを入れてね、という処理です
?>このように、プログラムでは基本的に情報を“名前のついた箱”の中にしまって扱います。
この箱には大きく分けて2種類あり、
中身をあとから変えられるもの(変数)と、
変えられないもの(定数)があります。
変数(中身をあとから変えられる箱)とは
変数の、中身をあとから変えられるとはどういうことなのか、実際にコードを見てみましょう。
<?php
$drink = "milk";
// はじめは $drink という箱の中に milk が入っている
echo $drink;
// => milk と表示される
$drink = "tea";
// 途中で中身を tea に入れ替えた
echo $drink;
// => tea と表示される(前の milk ではなく茶に変わった)
?>milktea
このように、変数の箱$drinkの中身が最初は牛乳でも、あとからお茶でも何にでも変えることができます。
プログラムはいつも同じデータを使うとは限りません。
たとえば…
- ログイン中のユーザーの名前は毎回変わる
- 残りHPはゲーム中に変化する
- 買い物かごの合計金額は商品を入れるたびに変わる
こうした状況に対応するために、「情報を入れる箱の中身を変えながら処理する」必要があります。
定数(中身をあとから変えられない箱)とは
中身をあとから変えられない定数。
では、もし定数の中身をあとから変えようとするとどうなるのか、実際に見てみましょう。
<?php
const DRINK = "milk";
// DRINK という定数に milk を設定(中身が変えられない箱)
echo DRINK;
// => milk と表示される
// ここで中身を変えようとすると…(わざと間違えた例)
DRINK = "tea";
// ★エラーになります!
// 定数は一度決めたら変更できないルールのため、書き換えようとするとPHPが止まります
echo DRINK;
// ここまで処理は到達せず、上の行でエラーになる
?>
Fatal error: Cannot re-assign const DRINK
今までの例と違って、実行結果がエラーになってしまいましたね。
Fatal error → プログラムを止めてしまうレベルの重大なエラー
Cannot re-assign → 再代入(もう一度値を入れる)ができません
const DRINK → DRINK という定数
つまり、「DRINK は const(定数)だから、中身を変えちゃダメだよ!」という意味です。
変数の時と違って、定数は急に「const」ってワードが出てきましたよね。
constは、そのまんま「定数」という意味です。
そして、constは、constant(コンスタント)の略です。
constantの意味:
「変わらないもの」「一定の」「不変の」
だから、中身を変えるとエラーになっちゃう不変の定数を作るコードにconstが使われているのですね。
プログラムの中には、途中で書き換わると困る値が存在します。
たとえば、消費税率・サイト名・アプリのバージョン番号などは勝手に変わってしまうと不具合につながります。
そこで「絶対に変えてはいけない値」を守るために定数を使います。
定数として固定しておくことで、プログラムの安全性が高まり、予期せぬバグを防ぐことができます。
型(箱の中身の種類)とは
変数や定数の説明では「箱(入れ物)」の例えを使いましたが、型(かた)とは、その箱の“中身の種類”のことです。
例えば10と"10"。
人間からすればどっちも同じ10に思えますが、コンピュータからすると種類が全然違います。
コンピュータから見ると…
| 表記 | 中身の意味 | 型 |
|---|---|---|
10 | 数としての10 | 数値 |
"10" | 文字としての「10」 | 文字列(string) |
10は数値で、"10"は文字列になります。
コンピュータは数値と文字列を別物として扱う必要があるので、このように種類を分けています。
プログラムでは文字列のデータをstringと表現します。
英単語としてのstringは、楽器の「弦」とか「ひも」「糸」、「何かがずらっと並んだ一続きのもの」という意味があります。
昔のプログラマの誰かが「文字がひも状に連なった構造」を表現するのに string という言葉を使い、それが専門用語として定着したとされているそうです。
ややこしいな。
変数・定数の箱の中に何が入っているかをハッキリさせないと、コンピュータは正しくプログラムを理解できないから、私たちが型を理解してあげる必要があります。
もし型が曖昧なままだと、エラーが起こりやすくなります。
では実際に、初心者がつまずきやすい 「型を間違えたことで起こるエラー」 の例を見てみましょう。
<?php
$price = "1000";
// 本当は数値として扱いたいのに、間違えて文字列(string型)で変数に"1000"を代入してしまった
$quantity = 2;
// 数値の2を変数に代入
// 合計金額(1000×2)を計算して、$totalには2000が入るつもり…だが
$total = $price * $quantity;
echo $total;
?>
Fatal error: Unsupported operand types: string * int
Fatal error → プログラムを止めてしまうレベルの重大なエラー
Unsupported operand types → サポートされていない演算(計算)対象の型です
string * int → 「文字列 × 整数」の組み合わせ
つまり、「文字列(”1000″ )と数値(2)を掛け算しようとしたからダメだよ!」という意味ですね。
文字列として判断される"1000"のクォーテーションを外して、$price = 1000; と修正すれば正しい計算結果が出るようになります。
$price = 1000;
これも実はエラーになります。
理由は、全角数字で入力しているからですね。
日本人はやりがちなパターンだと思いますが、全角で入力すると数字でもコンピュータからは文字列と判断されてしまいます。
文字列と数値以外の型もあります。
PHPに出てくる代表的な型の一覧を見てみましょう。
| 型 | 読み方 | 例 |
|---|---|---|
| string | ストリング(文字列) | "apple" |
| int (integerの略。integerの意味は整数) | 整数 | 10 |
| float (floating point(浮動小数点)の略) | 小数 | 3.14 |
| bool | 真偽値 | true / false |
bool(ブール)は19世紀の数学者ジョージ・ブールの名前が語源です。
ブールが数学として「真か偽か(正しいか間違っているか)」という考え方を誰でも使えるルールとしてまとめました。
プログラミングにおいて true / false を扱う型が bool と呼ばれているのはその名残です。
では、boolを使ったコードも見てみましょう。
<?php
$is_login = true; //変数 $is_login に真偽値 true(bool型)を代入
var_export($is_login);
// var_exportは、値の“中身をそのままの姿で表示する”命令
// echoでも表示できるが、true/falseなどの中身を確認したいときは var_export のほうがわかりやすい
echo "\n"; //見やすくするために改行します
$is_login = false; //変数$is_loginに真偽値falseを上書きで代入
var_export($is_login); // false と表示される
?>
true
false
先ほどのコードにvar_exportが出てきましたね。
ここをもしechoにした場合、trueは1、falseは何も表示されなくなります。
| 命令 | どんなときに使う? | 表示の例 |
|---|---|---|
| echo | アプリなどのユーザーに文章などを見せたいとき | 文字列:こんにちは数値:123 真偽値:1もしくは空欄 |
| var_export | プログラマや管理者が値の中身を正確に見たいとき | 文字列:'こんにちは'数値:123 真偽値:trueもしくはfalse |
ふだん画面に文章を出すときはechoを主に使います。
でも、プログラミングをしていると、echoの表示だとどこを間違えたのか分からず行き詰まってしまう時があります。
そんな時に変数の中身を正確に確認できるvar_exportが役立つことがあります。
\nについて\n は「ここで改行してね」という意味の記号です。
バックスラッシュ \ の入力方法
Windows → 「ろ」キー
Mac → option(⌥) キーを押しながら ¥
(※見た目は ¥ でも、コード上では \ として扱われます)
プログラム上ではバックスラッシュ(\)は、「特別な指示を出すための記号」になります。
\は「特別な命令の合図」nは new line(改行)
つまり\n は「改行しなさい」という命令になります
演算子(計算・比較・処理のための記号)
演算子とは、「計算する」「比べる」「つなげる」などの処理を行うための記号のことです。
数学でいう + や − のような記号に近いイメージですが、プログラミングではより多くの動きができます。
これまでのコードで出てきた = や === も演算子です。
では、PHPの演算子の一覧を見てみましょう。
言語によって多少違うものもありますが、だいたい同じです。
たくさんありますが、なんとなくこんなことができるんだなあーと流し見すればOKです。
算術演算子(数の計算)
| 演算子 | 意味 | 例 | 説明 |
|---|---|---|---|
+ | 足し算 | 3 + 2 | 3と2を足す(結果は5) |
- | 引き算 | 5 - 1 | 5から1を引く(結果は1) |
* | 掛け算 | 4 * 2 | 4と2をかける(結果は8) |
/ | 割り算 | 10 / 2 | 10を2で割る(結果は5) |
% | 余り(割ったあとの余りを出す) | 10 % 3 | 10を3で割った余り(結果は1) |
** | 累乗(べき乗)※ | 2 ** 3 | 2を3回かける(結果は8) |
代入・複合代入演算子(変数に入れる・足し込む)
| 演算子 | 意味 | 例 | 説明 |
|---|---|---|---|
= | 代入 | $a = 10 | $a に 10 を入れる |
+= | 足しながら代入 | $a += 3 | $a = $a + 3 と同じ |
-= | 引きながら代入 | $a -= 2 | $a = $a - 2 と同じ |
*= | 掛けながら代入 | $a *= 2 | $a = $a * 2 と同じ |
/= | 割りながら代入 | $a /= 2 | $a = $a / 2 と同じ |
.= | 文字列をくっつける | $s .= "World" | $s = $s . "World" と同じ |
算数だと = の意味は「等しい」になりますが、プログラミングだと「代入」になりますね。
比較演算子(同じかどうか・大きいかどうか)
| 演算子 | 意味 | 例 | 説明 |
|---|---|---|---|
== | 値が等しいか | $a == 10 | $aの中身は10? |
!= | 値が違うか | $a != 10 | $aの中身は10ではない? |
> | より大きい | $a > 10 | $aの中身は10より大きい? |
< | より小さい | $a < 10 | $aの中身は10より小さい? |
>= | 以上 | $a >= 10 | $aの中身は10以上? |
<= | 以下 | $a <= 10 | $aの中身は10以下? |
=== | 型も値も同じか(厳密比較) | $a === 10 | $aの中身は数値の10? |
!== | 型か値が違う | $a !== 10 | $aの中身は数値または文字列の10? |
結果は全て合ってるならtrue、違うならfalseです。
論理演算子(条件を組み合わせる)
| 演算子 | 意味 | 例 | 説明 |
|---|---|---|---|
&& | AND(かつ) | $a >= 5 && $b === $c | $aが5以上 かつ $bが$cと同じならtrue /どちらか1つでも違えば false |
| || | OR(または) | $a >= 5 || $b === $c | $aが5以上 または $bが$cと同じならtrue /どちらも違えば false |
! | NOT(ではない) | !$a | $aがtrueならfalse・falseならtrueになる |
if文とセットでよく使います。
インクリメント/デクリメント演算子(1足す・1引く)
| 記号 | 意味 | 例 | 説明 |
|---|---|---|---|
++ | 1 足す | $i++ | $i = $i + 1 と同じ |
-- | 1 引く | $i-- | $i = $i - 1 と同じ |
for文(ループ)で $i++ は「カウンターを1ずつ増やしながら繰り返す」という定番パターンです。
三項演算子(かんたんな if の省略形)
覚えておくと便利なやつも載せときます。
三項演算子は、if文を1行で書ける省略記法です。
<?php
$result = $score >= 60 ? "合格" : "不合格";
//$scoreが60以上でtrue なら "合格"を$resultに代入
//$scoreが60未満でfalse なら "不合格"を$resultに代入
//これを通常の書き方にすると…↓
/*
if ($score >= 60) {
$result = "合格";
} else {
$result = "不合格";
}
*/
//複数行をコメントにするときは↑こんなふうに「/* */」で囲みます
?>
というように、「条件 ? trueのとき : falseのとき」 の形で書ける演算子です。
他の言語でもほぼ同じ形で使われます。
通常の書き方と違って1行で済むので、内容がパッとわかりやすくなります。
スコープ(変数がどこで使えるかの範囲)
変数には 使える範囲(有効範囲) があり、そのことを スコープ と呼びます。
とくに代表的なスコープは次の2種類です。
| スコープ | どこで使える? |
|---|---|
| ローカル変数 | 関数・ブロックの中など、限られた範囲だけ |
| グローバル変数 | プログラム全体から参照できる |
ブロックは{…}で囲まれている中身のことです。
関数は次のコードの再利用と構造化の章で詳しく説明しますが、命令をまとめたリストのようなもので、ブロック{…}の前にfunction 関数名()がつきます。
では、ローカル変数を関数・ブロックの外で使うとどうなるのか見てみましょう。
<?php
function test() { // 関数testの宣言
$a = 10; // 関数の中でローカル変数を設定
echo $a; // $aを表示する
}
test(); // ← 関数testを呼び出し、10が表示される
if (true) { // もしtrueなら=問答無用で実行
$b = 20; // ブロックの中でローカル変数を設定
echo $b; // $bを表示する
}
echo $a; // × エラー(関数testの外だから使えない)
echo $b; // × エラー(ブロックif(true)の外だから使えない)
?>
10
20
Fatal error: Uncaught Error: Undefined variable $a
Fatal error → プログラムを止めてしまうレベルの重大なエラー
Uncaught → Errorキャッチ(処理)されていないエラー
Undefined variable $a → 「$a という変数が定義されていません」
つまり「重大なエラー:処理されていないエラーです。変数 $a は定義されていません」という意味になります。
$bのエラーに関するメッセージが出ないのは、その前の$a のエラーによりプログラムをコンピュータが強制的に止めたからです。
では、グローバル変数だとどうなるのかも見てみましょう。
<?php
$drink = "milk"; // グローバル変数(関数の外で作られている)
function test() {
// 関数の中でグローバル変数を使いたいときは global を宣言する
global $drink;
echo $drink; // OK → milk と表示される
}
test(); // 関数の実行
echo "\n"; // 改行(見やすさのため)
echo $drink; // OK → milk と表示される(関数の外で作られた変数なので当然使える)
?>
milk
milk
ここまで見ると、「全部グローバル変数にした方が便利じゃない?」って思いますよね。
でも、グローバル変数にはこういった弱点があります↓
- どこからでも変更できてしまう
- 変更箇所を特定しづらくバグの原因になりやすい
なので、基本は 必要な値は引数で渡す → 関数の返り値で受け取る というのが推奨されています。
引数、返り値についてはコードの再利用と構造化の章で説明するので、ここはなんとなくの理解で大丈夫です。
関数になんか数値がくっついてくるんだなーというぐらいに思っておいてください。
