【全5回】一番わかりやすいプログラミング基礎大全(2/5)

プログラミング

データを扱う基本要素(データを入れて使うための仕組み)

プログラムは“手順書”であると同時に、データを扱ってはじめて便利なことができるようになります。

  • 情報をどこかに保持しておく
  • 必要なときに取り出す
  • 必要に応じて書き換える
  • 計算したり、比較したりして判断する

こういったことができて、ようやく「ちゃんと使えるアプリ」を作れるようになります。

では、そのデータとは一体なんなのか?を、以下で説明していきます。

変数・定数と型(データを入れる箱の種類とルール)

先ほどの条件分岐の説明でこのコードを見てもらいましたよね。

PHP
<?php

$drink = "milk"; 
//これは、$drinkという名前の箱(変数)に「milk(牛乳)」というデータを入れてね、という処理です
?>

このように、プログラムでは基本的に情報を“名前のついた箱”の中にしまって扱います。

このには大きく分けて2種類あり、
中身をあとから変えられるもの(変数)と、
変えられないもの(定数)があります。


変数(中身をあとから変えられる箱)とは

変数の、中身をあとから変えられるとはどういうことなのか、実際にコードを見てみましょう。

PHP
<?php

$drink = "milk"; 
// はじめは $drink という箱の中に milk が入っている

echo $drink; 
// => milk と表示される

$drink = "tea"; 
// 途中で中身を tea に入れ替えた

echo $drink; 
// => tea と表示される(前の milk ではなく茶に変わった)

?>
実行結果

milktea

このように、変数の箱$drinkの中身が最初は牛乳でも、あとからお茶でも何にでも変えることができます。

補足:なぜ変数の中身を後から変える必要があるのか?

プログラムはいつも同じデータを使うとは限りません。

たとえば…

  • ログイン中のユーザーの名前は毎回変わる
  • 残りHPはゲーム中に変化する
  • 買い物かごの合計金額は商品を入れるたびに変わる

こうした状況に対応するために、「情報を入れる箱の中身を変えながら処理する」必要があります。


定数(中身をあとから変えられない箱)とは

中身をあとから変えられない定数。

では、もし定数の中身をあとから変えようとするとどうなるのか、実際に見てみましょう。

PHP
<?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(定数)だから、中身を変えちゃダメだよ!」という意味です。

補足1:constってどういう意味?

変数の時と違って、定数は急に「const」ってワードが出てきましたよね。

constは、そのまんま「定数」という意味です。

そして、constは、constant(コンスタント)の略です。

constantの意味:
「変わらないもの」「一定の」「不変の」

だから、中身を変えるとエラーになっちゃう不変の定数を作るコードにconstが使われているのですね。

補足2:なぜ中身を後から変えられない定数が必要なのか?

プログラムの中には、途中で書き換わると困る値が存在します。

たとえば、消費税率・サイト名・アプリのバージョン番号などは勝手に変わってしまうと不具合につながります。

そこで「絶対に変えてはいけない値」を守るために定数を使います。

定数として固定しておくことで、プログラムの安全性が高まり、予期せぬバグを防ぐことができます。


型(箱の中身の種類)とは

変数や定数の説明では「箱(入れ物)」の例えを使いましたが、型(かた)とは、その箱の“中身の種類”のことです。

例えば10と"10"
人間からすればどっちも同じ10に思えますが、コンピュータからすると種類が全然違います。

コンピュータから見ると…

表記中身の意味
10数としての10数値
"10"文字としての「10」文字列(string)

10は数値で、"10"は文字列になります。

コンピュータは数値と文字列を別物として扱う必要があるので、このように種類を分けています。

補足1:文字列がstringになるのはなんで?

プログラムでは文字列のデータをstringと表現します。

英単語としてのstringは、楽器の「弦」とか「ひも」「糸」、「何かがずらっと並んだ一続きのもの」という意味があります。

昔のプログラマの誰かが「文字がひも状に連なった構造」を表現するのに string という言葉を使い、それが専門用語として定着したとされているそうです。

ややこしいな。

補足2:なんで型が必要なの?

変数・定数の箱の中に何が入っているかをハッキリさせないと、コンピュータは正しくプログラムを理解できないから、私たちが型を理解してあげる必要があります。

もし型が曖昧なままだと、エラーが起こりやすくなります。

では実際に、初心者がつまずきやすい 「型を間違えたことで起こるエラー」 の例を見てみましょう。

PHP
<?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; と修正すれば正しい計算結果が出るようになります。

補足3:全角にも気をつけろ

$price = 1000;

これも実はエラーになります。

理由は、全角数字で入力しているからですね。

日本人はやりがちなパターンだと思いますが、全角で入力すると数字でもコンピュータからは文字列と判断されてしまいます。

補足4:型の一覧

文字列と数値以外の型もあります。

PHPに出てくる代表的な型の一覧を見てみましょう。

読み方
stringストリング(文字列)"apple"
int
(integerの略。integerの意味は整数)
整数10
float
(floating point(浮動小数点)の略)
小数3.14
bool真偽値true / false

bool(ブール)は19世紀の数学者ジョージ・ブールの名前が語源です。
ブールが数学として「真か偽か(正しいか間違っているか)」という考え方を誰でも使えるルールとしてまとめました。
プログラミングにおいて true / false を扱う型が bool と呼ばれているのはその名残です。

では、boolを使ったコードも見てみましょう。

PHP
<?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

補足5:echoとvar_exportの違い

先ほどのコードにvar_exportが出てきましたね。
ここをもしechoにした場合、trueは1、falseは何も表示されなくなります。

命令どんなときに使う?表示の例
echoアプリなどのユーザーに文章などを見せたいとき文字列:こんにちは
数値:123
真偽値:1もしくは空欄
var_exportプログラマや管理者が値の中身を正確に見たいとき文字列:'こんにちは'
数値:123
真偽値:trueもしくはfalse

ふだん画面に文章を出すときはechoを主に使います。

でも、プログラミングをしていると、echoの表示だとどこを間違えたのか分からず行き詰まってしまう時があります。
そんな時に変数の中身を正確に確認できるvar_exportが役立つことがあります。

補足6:改行\nについて

\n は「ここで改行してね」という意味の記号です。

バックスラッシュ \ の入力方法
Windows → 「ろ」キー
Mac → option(⌥) キーを押しながら ¥
(※見た目は ¥ でも、コード上では \ として扱われます)

プログラム上ではバックスラッシュ(\)は、「特別な指示を出すための記号」になります。

\は「特別な命令の合図」
nは new line(改行)
つまり\n は「改行しなさい」という命令になります

演算子(計算・比較・処理のための記号)

演算子とは、「計算する」「比べる」「つなげる」などの処理を行うための記号のことです。
数学でいう + や − のような記号に近いイメージですが、プログラミングではより多くの動きができます。

これまでのコードで出てきた = や === も演算子です。

では、PHPの演算子の一覧を見てみましょう。
言語によって多少違うものもありますが、だいたい同じです。

たくさんありますが、なんとなくこんなことができるんだなあーと流し見すればOKです。


算術演算子(数の計算)

演算子意味説明
+足し算3 + 23と2を足す(結果は5)
-引き算5 - 15から1を引く(結果は1)
*掛け算4 * 24と2をかける(結果は8)
/割り算10 / 210を2で割る(結果は5)
%余り(割ったあとの余りを出す)10 % 310を3で割った余り(結果は1)
**累乗(べき乗)※2 ** 32を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
<?php

$result = $score >= 60 ? "合格" : "不合格";
//$scoreが60以上でtrue なら "合格"を$resultに代入
//$scoreが60未満でfalse なら "不合格"を$resultに代入

//これを通常の書き方にすると…↓
/*
if ($score >= 60) {
    $result = "合格";
} else {
    $result = "不合格";
}
*/
//複数行をコメントにするときは↑こんなふうに「/* */」で囲みます

?>

というように、「条件 ? trueのとき : falseのとき」 の形で書ける演算子です。
他の言語でもほぼ同じ形で使われます。

通常の書き方と違って1行で済むので、内容がパッとわかりやすくなります。

スコープ(変数がどこで使えるかの範囲)

変数には 使える範囲(有効範囲) があり、そのことを スコープ と呼びます。

とくに代表的なスコープは次の2種類です。

スコープどこで使える?
ローカル変数関数・ブロックの中など、限られた範囲だけ
グローバル変数プログラム全体から参照できる

ブロックは{…}で囲まれている中身のことです。

関数は次のコードの再利用と構造化の章で詳しく説明しますが、命令をまとめたリストのようなもので、ブロック{…}の前にfunction 関数名()がつきます。

では、ローカル変数を関数・ブロックの外で使うとどうなるのか見てみましょう。

PHP
<?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
<?php

$drink = "milk";   // グローバル変数(関数の外で作られている)

function test() {
    // 関数の中でグローバル変数を使いたいときは global を宣言する
    global $drink;

    echo $drink;  // OK → milk と表示される
}

test(); // 関数の実行

echo "\n"; // 改行(見やすさのため)

echo $drink; // OK → milk と表示される(関数の外で作られた変数なので当然使える)

?>
実行結果

milk
milk

ここまで見ると、「全部グローバル変数にした方が便利じゃない?」って思いますよね。

でも、グローバル変数にはこういった弱点があります↓

  • どこからでも変更できてしまう
  • 変更箇所を特定しづらくバグの原因になりやすい

なので、基本は 必要な値は引数で渡す → 関数の返り値で受け取る というのが推奨されています。

引数、返り値についてはコードの再利用と構造化の章で説明するので、ここはなんとなくの理解で大丈夫です。

関数になんか数値がくっついてくるんだなーというぐらいに思っておいてください。

ground

GROUND Creative Division

制作依頼・お見積のご相談はこちらから

依頼する

© GROUND All rights reserved.