テクノロジー
2023年2月2日nullと正規表現
- nullと正規表現について理解できる
- 評価ポイントとコメントを受け取って表示するプログラムを作成する
目次
・nullとは
・変数がnullであるかどうかをチェックする関数
・正規表現とは
・評価ポイントとコメントを受け取って表示するプログラムをつくってみよう
・受け取ったポイントを数値にして条件分岐しよう
・コメントを受け取って、ポイントとコメントを表示しよう
・while
と break
で繰り返しを実装しよう
・解答コード
・まとめ
・公式ドキュメント・参考情報
nullとは
null
は、値を持たない変数を表す場合に用いる値です。null
はnull
型において唯一使用可能な値です。
PHPの真偽値ルールでは、null
も偽として扱われます。
例えば、データベースの中から条件に該当するデータを検索するプログラムを作成した場合や、該当するデータがなかった場合の処理を記述する時などによく使われます。
[例]
<?php
function search(){
// データを検索する処理
// 検索結果がなかった時は null が返る
}
if (search()) {
// なにかしら検索結果があった時の処理
echo 'データがありました' . PHP_EOL;
} else {
// 検索結果がなかった時の処理
echo 'データがありませんでした' . PHP_EOL;
}
上記の例で、search
という関数は、データを検索して検索結果を返す関数を定義していると想定します。
もし検索結果が0
という数字であったり空文字以外にnull
が返される場合があります。
これらの値が返された場合、偽と評価されるので echo 'データがありませんでした' . PHP_EOL;
が実行されます。
変数がnullであるかどうかをチェックする関数
is_null
関数を使用すると、値自身や変数に代入されている値が null
かどうかを確認することができます。
この関数は、変数が null
の場合は true
を、そうでない場合は false
を返します。
[例]
<?php
$foo = null;
$bar = 0;
$buz = '';
var_dump (is_null($foo));
var_dump (is_null($bar));
var_dump (is_null($buz));
[実行結果]
bool(true)
bool(false)
bool(false)
変数の値が null
かどうかを判定するときは、is_null
関数を使うか、is_null
関数は使わずに、if ($number === null)
($number
は変数)のように直接比較する書き方もできます。
正規表現とは
正規表現は少し難しいですが、どのような時に使用され、どのようなものなのかということは理解しておきましょう。
これからPHPでプログラミングしていく中で、このようなコードを見かけるかもしれません。
<?php
$reg = "/[a-z0-9_]+/";
この呪文のようなコードが正規表現です。
正規表現とは、ある文字の並び(文字列)を表現する方法です。
例えば、Webサイトの入力フォームで電話番号を入力させる時、入力されたデータが電話番号として正しい数字かどうかを判断する時などに使用します。
電話番号の場合、10桁であること、0から始まることなど、一定のルールがあります。送られてきたデータがそのルールとマッチしているかどうかチェックするときに、一定のルールを表現したものが正規表現です。正規表現自体はPHP以外の言語でも使われる表現方法です。
正規表現で用いられる/
をデリミタといいます。デリミタとは区切り文字のことで、正規表現を記述する場合、正規表現の部分をデリミタで囲みます。
デリミタには、文字、数字、バックスラッシュ、スペース以外の任意の記号も使用できます。
最も一般的な区切り文字はフォワードスラッシュ(/
)ですが、正規表現にフォワードスラッシュが含まれている場合は、一般的に#や~
などの区切り文字を使用します。
ここでは正規表現の使い方などの説明はしませんが、既存のコードで正規表現オブジェクトを見かけた時に「これは正規表現だな」と理解できるようにしておきましょう。
評価ポイントとコメントを受け取って表示するプログラムをつくってみよう
それでは、ここまで学習したことを使って、掲示板アプリケーションのバックエンドプログラムの基礎を作ってみましょう。
sample.php
の中身を削除して新しく記述していきましょう。
ここで作成するプログラムの要件を再度確認します。要件を見て、まずは自分でプログラムを考えてみてください。
このテキストの末尾に解答コードがあります。
難しい場合は、テキストを読み進めながら要件1〜6を実装していきましょう。
プログラムの要件
- “1から5の数字で評価を入力してください。終了する場合は「6」を入力してください”と出力する
readline
で入力された評価ポイント受け取る- 数字以外を入力された場合は”数字を入力してください”と出力して入力モードに移行する。6が入力された場合は”終了します”と出力してプログラムを終了する(今回入力される数字は、1から5の数字または6である想定で作成します)
readline
で入力されたコメントを受け取る- 評価ポイントとコメントを”あなたのポイント:○ あなたのコメント:○○○”と出力する
- 1に戻る
PHPコマンドを使い、逐一実行結果を確認しながら進めてみましょう。
受け取ったポイントを数値にして条件分岐しよう
-
“1から5の数字で評価を入力してください。終了する場合は「6」を入力してください”と出力する
メッセージをreadline()
で出力します。 -
readline
で入力された評価ポイント受け取る
評価ポイントを受け取るために$point
変数を用意します。
$point
変数にreadline()
で入力された値をintval()
で数値に変換して変数の$point
に格納します。
<?php
$point = intval(readline('1から5の数字で評価を入力してください。終了する場合は「6」を入力してください' . PHP_EOL));
3. 数字以外を入力された場合は”数字を入力してください”と出力して入力モードに移行する。6が入力された場合は”終了します”と出力してプログラムを終了する(今回入力される数字は、1から5の数字または6である想定で作成します)
条件を整理しましょう。今回の分岐は「1から5の数字を入力した場合」、「6を入力した場合」、「数字以外を入力した場合」の3つです。
「$point
が1から5の数字の場合」、「$point
が6の場合」、「$point
が数字以外の場合」です。この三つの条件を if
で条件分岐します。
三つの条件のうちどれを if
の条件にし、どれを elseif
の条件にするのが効率的か考えます。
if
の条件は狭く、elseif
は if
の条件からは漏れたけれども他の条件に当てはまるもの、else
はそれ以外という広い条件です。指定する条件が狭いものから if
、elseif
、`elseの順に設定していきましょう。
まず一番条件が狭いのが 「$point
が6の場合」 ですので、これを if
の条件にします。
「$point
が6の場合」の処理は、「”終了します”と出力する」です。
// 省略
if ($point === 6) {
echo '終了します' . PHP_EOL;
} elseif (.....) {
} else {
}
// 省略
次に狭いのが 「$point
が1から5の数字の場合」 です。今回は数字を入力された場合は1から5、または6が必ず入力される想定で作成します。「$point
が数字の場合」に置き換えても大丈夫でしょう。
数字以外が入力された文字に intval()
を使うと 0
になるため、elseif
に point !== 0
という条件式をおきます。
「$point
が1から5の数字の場合」の処理は if
のコードが完成してから記述しましょう。
// 省略
if ($point === 6) {
echo '終了します' . PHP_EOL;
} elseif ($point !== 0) {
// $pointが1から5の数字の場合の処理
} else {
}
// 省略
「$point
が数字以外の場合」 はそれ以外のすべてに該当しますので else
に処理を記述します。
「$point
が数字以外の場合」の処理は「数字以外を入力された場合は”数字を入力してください”と出力して入力モードに移行する」です。
入力モードにするということは $point = readline()
に戻るということなので、最終的に全体を繰り返し処理させれば実現できます。
// 省略
if ($point === 6) {
echo '終了します' . PHP_EOL;
} elseif ($point !== 0) {
// $pointが1から5の数字の場合の処理
} else {
echo '数字を入力してください' . PHP_EOL;
}
// 省略
現時点でのコードは以下の通りです。
<?php
$point = intval(readline('1から5の数字で評価を入力してください。終了する場合は「6」を入力してください' . PHP_EOL));
if ($point === 6) {
echo '終了します' . PHP_EOL;
} elseif ($point !== 0) {
// $pointが1から5の数字の場合の処理
} else {
echo '数字を入力してください' . PHP_EOL;
}
コメントを受け取って、ポイントとコメントを表示しよう
「$point
が1から5の数字の場合」、「$point
が6の場合」、「$point
が数字以外の場合」のうち、「$point
が1から5の数字の場合」だけコメントを受け取って、ポイントとコメントを表示する処理が入ります。
コードの elseif ($point !== 0)
の中の処理を作っていきましょう。
<?php
$point = intval(readline('1から5の数字で評価を入力してください。終了する場合は「6」を入力してください' . PHP_EOL));
if ($point === 6) {
echo '終了します' . PHP_EOL;
} elseif ($point !== 0) {
// この部分の処理を作る
} else {
echo '数字を入力してください' . PHP_EOL;
}
readline
で入力されたコメントを受け取る
コメントを受け取るために $comment
を用意し、readline
で入力された値を格納します。
$comment = readline('コメントを入力してください' . PHP_EOL);
5. 評価ポイントとコメントを”あなたのポイント:○ あなたのコメント:○○○”と出力する
評価ポイントとコメントを表示するため、それぞれの変数を式展開して echo
で出力させます。
$comment = readline('コメントを入力してください' . PHP_EOL);
echo "あなたのポイント: $point" . PHP_EOL;
echo "あなたのコメント: $comment" . PHP_EOL;
これで「$point
が1から5の数字の場合」の処理が完成です。elseif
の中に入れましょう。
<?php
echo '1から5の数字で評価を入力してください。終了する場合は「6」を入力してください' . PHP_EOL;
$point = intval(readline());
if ($point === 6) {
echo '終了します' . PHP_EOL;
} elseif ($point !== 0) {
$comment = readline('コメントを入力してください' . PHP_EOL);
echo "あなたのポイント: $point" . PHP_EOL;
echo "あなたのコメント: $comment" . PHP_EOL;
} else {
echo '数字を入力してください' . PHP_EOL;
}
while
と break
で繰り返しを実装しよう
6. 1に戻る
1に戻るため、繰り返し処理を追加します。
繰り返し処理は while
を使い、これまでに作成したコードを追加します。
「$point
が6の場合」以外は処理を繰り返したいので、「$point
が6の場合」のみ break
で処理を抜け、それ以外の場合は特に条件なく繰り返し処理をします。
while
の条件を true
としておけば常に真のため、条件なく繰り返し処理をさせることができます。
<?php
while (true) {
// これまでのコードを追加し、「pointが6の場合」のみbreakで処理を抜ける
}
while
の処理を記述し、プログラムが完成しました。
解答コード
[sample.php]
<?php
while (true) {
$point = intval(readline('1から5の数字で評価を入力してください。終了する場合は「6」を入力してください' . PHP_EOL));
if ($point === 6) {
echo '終了します' . PHP_EOL;
break;
} elseif ($point !== 0) {
$comment = readline('コメントを入力してください' . PHP_EOL);
echo "あなたのポイント: $point" . PHP_EOL;
echo "あなたのコメント: $comment" . PHP_EOL;
} else {
echo '数字を入力してください' . PHP_EOL;
}
}
まとめ
- null
は、値が存在しないことを表すnull
型の唯一の値である。
- 正規表現は、データが特定のルールにマッチするかどうかなどをチェックするために使用され、デリミタで囲むことで正規表現と認識される。