未経験・初心者向け「PHP鬼練1〜5」- 変数・if文・switch文 –

ここでは、初心者から実践的に学べるプログラミングスクール「ウェブカツ!!」PHP・MySQL部入門を受講している生徒の方向けに、さらに理解度を上げるための特訓をしていきます。

出題の回答は全て「PHP言語」を使って回答してください。

使用するPHPのバージョンは5.6系以降を使ってください。(MAMPをインストールしていれば、そのままのバージョンで問題ありません)

PHPのバージョンによって使えない「関数」など機能がありますが、回答には5.6系以降のものであれば使えるものしか使っていません。

(それより前のバージョンでも使えるはずですが、確認はしてないし、そもそもそんなバージョンで開発する機会なんて実務じゃないので、確認する必要もないし。な感じです)

開発環境はMacとGoogleChromeブラウザを使います。

Windowsの人もGoogleChromeブラウザを使いましょう。

鬼練1:「仕事と私」どっちを取るのよ!

仕様書

下記要件に従ってプログラムを組んでみてください。

画面に「彼女:仕事と私どっちを取るのよ!」という文字を表示する

 

ヒント

PHPで開発ツールのコンソールに文字を表示させる(文字を表示させることを「文字を出力する」なんて言い方をします)には「echo」というものを使います

を使います。

答え

phpの特訓なのでhtmlはなんでもいいです。

部活でもやったようにファイル名の拡張子には「.php」を使うんでしたね。

 

そして、WEBサーバー(ウェブカツではApacheというサーバーソフトを使っています)と呼ばれるサーバーの中の「指定のフォルダの場所」の中にファイルをおく必要がありますね。

また、htmlの中にPHP言語のプログラムを書くには「<?php」「?>」で囲うんでしたね。

囲ったものだけが「PHP言語で書かれたコード」とサーバーは判断し、その命令を解釈してその命令通りに処理をしてくれます。

 

 

そして、今回の答えは簡単ですね。

で表示させるだけです。

他にもechoの他にも文字列を表示させるには「print」というものもあります。

どちらでも構いませんが、PHPではechoが多数派です。

厳密には若干違いもありますが、意識する必要ないです。使わないので。(暇な人は「echo print 違い」で調べるといいです)

文字列は「’(シングルクウォート)」「”(ダブルクウォート)」で囲えば、機械(ブラウザ)には「文字」として判別してくれます。

シングルかダブルかどっち使った方がいいの?というと「シングルクウォート」を基本は使ってください。

なぜか?は次でやります。

鬼練2:「仕事と私」どっちを取るのよ!お怒り編

前回の続きです。

もっとお怒りな感じにしてみましょう。

仕様書

下記要件に従ってプログラムを組んでみてください。

画面に「彼女:仕事と私どっちを取るのよ!」をh1タグを使って、赤字でフォントサイズ200pxで表示させる

答え

 

こういうようにphpを使って「文字列としてhtmlタグを出力する」ってことも出来ます。

ちなみに

とhtmlタグは普通に書いてしまって、言葉だけechoで表示しても同じ画面にはなりますね。

(まぁ、そもそもこのくらいなら実際にはphp使う必要はもちろんないわけですが、練習なんでね。)

ここで、気をつけなければいけないのがechoを使う際に「’(シングルクウォーテーション)」で囲うってことです。

ちなみに鬼練1の場合では、echoを使う時にシングルクウォーテーションなどで何も囲わなくも実は表示出来ちゃいます。

でも、今回の場合を「’」や「”」で囲わないでやってみるとどうなるか?

「HTTP ERROR 500」

になっちゃいます。(ブラウザ種類やバージョンによって表示される画面が微妙に違いますが。絶対に「500」と「ERROR」って文字がどっかに出てます。)

いわゆる「500エラー(ごひゃくえらー)」って呼ばれるもので、

「サーバーがPHP言語を解釈できないのでプログラム実行できないよ」

ってエラーです。サーバーから

「お前が書いた命令わかんねーよ。理解できねーよ。そんなんじゃ、俺は仕事できねーよ。。書き方が悪いんだよバカヤロウ!(女性かもしれないけど)」

って言われたってことです。

そして、今度は「”」で囲ってやってみましょう。

同じですね??

500エラー出ましたね?

なぜかというと

「HTMLのh1タグでstyle属性を書く時に”(ダブルクウォーテーション)」を使ってるから。

です。

PHP言語のechoを出力するために”を使っているのにstyle属性でも使ってるので、

「どっからどこまでを囲ったんだ?」

とサーバーがまた理解できないわけですね。

これはjsでも同じです。jsでもhtmlを文字として出力できるので、phpでもjsでも「文字列はシングルクウォーテーションで囲う」のが一般的なわけです。

でも、初心者はそんなこと知らずにダブルクウォーテーション使ってたりするので、ダブルクウォーテーション使ってるだけで「初心者だな」と分かっちゃうわけです。

別にhtmlを出力しない箇所なら使ってもいいんでしょ?

と思う人もいるかもしれませんが、

あっちでシングルクウォーテーション使って、こっちの出力ではダブルクウォーテーション使うくらいなら

シングルクウォーテーションに統一でいいじゃん。

統一されてた方がコードが見やすいし。

ってことです。

鬼練3:「仕事と私」どっちを取るのよ!修羅場編

前回の続きです。

jsの鬼練でもやりましたね。

彼女の気持ちに正直に答えたら、修羅場になっちゃったパターンをphpで書いてみましょう。

仕様書

下記要件に従ってプログラムを組んでみてください。

画面に

「彼女:仕事と私どっちを取るのよ!」という文字をに表示させる

その次に

「自分:◯◯◯」を表示させる。

◯◯◯は変数(変数answerとする)にしておき、その変数の中身を表示させる。

変数answerには「仕事に決まってるだろ!」の文字列を入れておく。

変数answerの中身が「仕事に決まってるだろ!」だった場合には、

「彼女:あたたたたたたたっーーー!!」と

「自分:ひでぶっ!!」という文字を表示させる

答え

phpで書くとこんな感じですね。

今回から、回答にはhtmlタグとphpの<?phpと?>の囲みタグは省略していきます。

STEP1:変数answerの定義

まず変数answerという箱を用意して、その中に「仕事に決まってるだろ!」という文字列を入れておきますね。

「変数」というのはjsでもやりましたね?プログラミング言語の最初の関門です。

変数は「箱」です。ただの箱。ダンボールの箱的なやつです。

箱の中には色々なデータを入れておけるわけですね。

データには「文字列」やら「数値」やら「種類(型)」ってもんがありましたね?

って、もうjs鬼練で書いた記事内容をまんまコピペですよ。(楽したいんだもの)

ただ、PHPの場合はjsと違って変数を用意するには

変数名の前に$(ダラー)をつける

必要があるので、ごっちゃにならないように注意しましょう。

(最初の頃はごっちゃになるので仕方ないです。

僕はjsも書いてphpも書いてjavaも書いてrubyも書いてと仕事で同時平行で色々な言語を使って開発をしていますが、今でも間違いて書いちゃいますから)

また、jsではコンソールに1行ずつ出してましたが、phpではechoは改行されないので<br>タグを入れています。

 

 

STEP2:文字列の連結でコンソールに表示

話もどって、変数用意したら、そのあとにechoで文字を表示します。

で変数の中身も画面に表示してますね。

jsでは文字の連結は「+」でしたがphpでは「.(ドット)」を使います。

 

STEP3:変数answerの中身をif文で判定する

出ました、if文。jsと書き方は全く一緒。

日本語で言うと「もし、〜〜ならこの処理をする」っていう書き方が出来るものです。

それが、これですね。

if文の書き方はやりましたね?

という書き方です。

判定式は

「===」という「左と右の値が同じだったら」という肯定系や

「!==」という「左と右の値が違ったら」という否定形

なんかがありましたね。

他のプログラミング言語では「==」と「!=」が一般的ですが、jsや今後やるPHPに限っては使わないようにしましょう。

「===」や「!==」といった「厳密比較」と呼ばれる比較式を使うようにしましょう。

厳密比較では値の「型」も同じかどうか?まで判定されるものです。

今の時点でよく分からなければそのうちわかっていきます。

今回の場合だとif文のカッコの中は

ですね。

なので

変数answer(の中身)と文字列「仕事に決まってるだろ!」が同じ場合

という意味の式になりますね。

厳密比較なのでお互いの「型」まで同じかどうか?を判定します。

左辺の変数answerの中には

文字列型の「仕事に決まってるだろ!」

という値が入っていて、右辺も

文字列型の「仕事に決まってるだろ!」

という値なので、

「型も値も同じ」

ってことになりますね。

判定の結果というのは「true」または「false」のboolean型で返ってきます。

なので、

というif文の中身の判定がまず最初にされて、trueという結果になり

に変わります。(内部的に変わってるだけで目に見えるわけじゃないですよ?)

そして、if文というのは

判定式内が「true」の時に「{(波括弧)」内の処理を行う

という決まりがあるので、今回の場合は中身の処理が実行されて画面に表示されるわけですね。

鬼練4:「仕事と私」どっちを取るのよ!結局修羅場編

前回の続きです。

彼女の気持ちに正直に答えたのに、結局また修羅場です。

仕様書

下記要件に従ってプログラムを組んでみてください。

画面に

「彼女:仕事と私どっちを取るのよ!」という文字をに表示させる

その次に

「自分:◯◯◯」を表示させる。

◯◯◯は変数(変数answerとする)にしておき、その変数の中身を表示させる。

変数answerには「仕事よりも君が大事さ。仕事はもう嫌で嫌で嫌で。。嫌で嫌で嫌で。。ほんと嫌なんだ。」の文字列を入れておく。

変数answerの中身が「仕事に決まってるだろ!」だった場合には、

「彼女:あたたたたたたたっーーー!!」と

「自分:ひでぶっ!!」という文字を表示させる

変数answerの中身が「仕事よりも君が大事さ。仕事はもう嫌で嫌で嫌で。。嫌で嫌で嫌で。。ほんと嫌なんだ。」だった場合には、

「彼女:仕事してこいやーーーーーー!!」と

「自分:ひでぶっ!!」という文字を表示させる

はい、出ました。ダメ男再来。

答え

 

 

変数の作り方が違う以外はjsとほぼ同じ。(あと改行タグついてるだけ)

一点だけ違うのは「elseif」と書いてあるだけ。

ちなみにphpでは「elseif」と繋げて書くこともできるし「else if」とスペース空けて書くこともできます。

どっちでもいいです。現場によって合わせてください。

PHPで少しでも速いコードを書きたい時のためのメモ

PHP、「else if」と「elseif」の違い

ちなみにphpだとif文やfor文を「:(コロン)」を使って書く方法もあります。

波括弧がコロンに置き換わった感じですね。

最後は「endif;」で終わります。

見やすさ的にどれがいいかですね。

if文の中にif文があって、さらにその中にif文があって〜みたいなif文やfor文が「ネスト(入れ子)」している場合、

終わりの波括弧が

「どのif文に対応した波括弧?そもそもif文の波括弧?for文のやつ?」

と分かりにくいです。

ウェブカツで今後やっていくwordpressのようにhtmlと合わせて書く場合、

間にhtmlが色々入って長ったらしくなるので余計分かりにくい。

そういう時に使うとわりかし分かりやすくはなります。

まぁ、そもそも

何階層もネストして書かなければいけない状態にしない!

ってのが大事なんですが。それはおいおい話してくことなのでここでは省略します。

ちなみにコロンを使った書き方の場合は「else if」とスペース入れて書いちゃうと500エラーです。

鬼練5:「仕事と私」どっちを取るのよ!運命の選択編

前回の続きです。

彼女の気持ちに正直に答えたいです。ランダムで。

仕様書

下記要件に従ってプログラムを組んでみてください。

画面に

「彼女:仕事と私どっちを取るのよ!」という文字をに表示させる

その次に

「自分:◯◯◯」を表示させる。

◯◯◯は変数(変数answerとする)にしておき、その変数の中身を表示させる。

変数answerには

「仕事に決まってるだろ!」

「仕事よりも君が大事さ。仕事はもう嫌で嫌で嫌で。。嫌で嫌で嫌で。。ほんと嫌なんだ。」

「ぐ・・ぐへ・・ぐへへぇ・・・き・・きみが大事さぁぁ・・・ぐへへぇ。」

のいずれかの文字列をランダムで入れておく。

変数answerの中身が「仕事に決まってるだろ!」だった場合には、

「彼女:あたたたたたたたっーーー!!」と

「自分:ひでぶっ!!」という文字を表示させる

変数answerの中身が「仕事よりも君が大事さ。仕事はもう嫌で嫌で嫌で。。嫌で嫌で嫌で。。ほんと嫌なんだ。」だった場合には、

「彼女:仕事してこいやーーーーーー!!」と

「自分:ひでぶっ!!」という文字を表示させる

変数answerの中身が「ぐ・・ぐへ・・ぐへへぇ・・・き・・きみが大事さぁぁ・・・ぐへへぇ。」だった場合には、

「彼女:ひぃぃぃぃぃぃぃぃぃぃぃぃぃぃぃぃぃぃぃぃ!!」と

「自分:ひでぶっ!!」という文字を表示させる

たぶん、彼氏ってこんな顔してるんだと思います。

ヒント

phpでランダムを実現するには

と書くことで、0から2までの整数値が結果として返ってきます。

カッコの中に数値を2つカンマ区切りで指定してやれば、最小値から最大値までの整数値がランダムでもらえます。

答え

 

js鬼練では2択でしたが、今回は3択ですね。

変態おじさんが混じってます。

ランダム数値の生成にはmt_rand()の他にもrand()がありますが、mt_rand()の方が高性能なのでそちらを使いましょう。

(もちろん、そう言われたら「調べる」癖つけましょうね)

3択なので、4行目からのif文は色々な書き方できますね。

この回答だと

「変数randが0の場合、または1の場合、またはそれ以外」

という書き方です。

でも、もう分かってきてると思いますが、これだとあとあとで

「4択になったら?数値が3の場合が追加されたら?」

に対応できませんね。

数値が「2」と「3」の時にはelse側の処理に全部入っちゃいますね。

なので、最初にこういう書き方をしてしまったとすると

elseの部分を削って

のようにするか

にするような修正を加える対応になります。

こうなると考えなければならないのが

「テスト」がどうなるか?

です。

テストのことを考えてみよう

2つの修正方法が今回ありますが、コードはどこを修正しましたか?

if文の条件分岐は元は3つですね?

「変数randが0の場合、または1の場合、またはそれ以外(変態おじさんの場合)」

の3つ。

これが1つ目の修正方法だと

「変数randが0の場合、または1の場合、または2の場合(変態おじさんの場合)、または3の場合(新らしいやつ)

と修正したわけです。

分かりますか?

既存の分岐の1つを修正(「それ以外」という条件から「2の場合」という条件に変えた)+ 分岐をもう1つ追加した(3の場合)

わけですね。

なので、この修正をした場合「何をテストしなきゃいけないか?」というと

「それ以外」という条件 ⇨ 2の場合という条件

にまず変えたわけなので

「変数randが2の場合にその条件分岐に入るか(その条件分岐内の処理が問題なく実行されるか?)」

をテストしないといけないですね。

ちなみにその条件の中の処理は今回全く修正してないので「テストは不要」です。

条件だけを変えただけで、中の処理を修正していない以上、その分岐条件にちゃんと処理が入ってくれさえすれば、その後の中の処理は「既に最初に作った時にテスト済み」だからです

回答のコードを書いた時にテストはしているはずですからね。今回は既にテスト済みの既存コードに修正を加えたので、修正を加えた部分に影響する箇所だけをテストすればいいからです。(まぁ、現場によってはそこもさらっとだけ簡単にテストしたりもします)

さらに

「分岐をもう1つ追加した(3の場合)」

のコードを追加したわけなので

「変数randが3の場合にその分岐にちゃんと入るか?(新たに新設した分岐にちゃんと入るか?)」

「変数randが3の場合にその分岐の中に書いた処理が問題なく動くか?(変数answerに指定のセリフがちゃんと入っているか?)」

を確認しなきゃならんわけですね。

それが、「テスト」です。

まとめると最初の修正方法だった場合は、

  1. 変数randが2の場合にその条件分岐に入るか
  2. 変数randが2の場合にその条件分岐内の処理が問題なく実行されるか?
  3. 変数randが3の場合にその分岐にちゃんと入るか?(新たに新設した分岐にちゃんと入るか?)
  4. 変数randが3の場合にその分岐の中に書いた処理が問題なく動くか?(変数answerに指定のセリフがちゃんと入っているか?)

の4点を確認する必要があるわけです。

2つ目の修正方法だとどうなの?

じゃあ、2つ目の修正方法だとどうなるかです。

にする修正方法ですね。

言葉にすると

  1. 変数randが2の場合という分岐を追加し、変数answerに入れるセリフを変態おじさんに置き換える。(分岐内の処理を変える)
  2. 「それ以外」の分岐の中の処理を変える(変数answerに入れるセリフを新しいものに置き換える。)

って修正をしたわけですね。

それに対して、今回の修正によって「何をテストしなきゃいけないか?」というと

  1. 変数randが2の場合にその条件分岐に入るか?
  2. 変数randが2の場合にその条件分岐内の処理が問題なく実行されるか?(変数answerに指定のセリフが入っているか?)
  3. 「それ以外」の分岐の中に書いた処理が問題なく動くか?(変数answerに指定のセリフが入っているか?)

ということになります。

(これは、かなり簡単な「テストの考え方」になりますが、実際にはもっと細かな部分の考え方があるので、それは今後新設される「テスト部」でやっていきます。)

最初の修正よりは確認項目が1つ減りましたね。

要は「テスト工数(テストにかかる時間=テストにかかるお金)が1つ減った」ってことです。

時間もお金も少なくて済む修正方法だ。ってことですね。

でも、結局こうしたらいんじゃない?

でも、そもそもあとあとで追加する可能性があるのなら、最初から

と書かずに

と書いときゃいいんですよ。

だって、そうすれば、そこから変数randが3の場合という条件分岐を追加すれば済みますよね?

こんな感じで。

こうすれば、

修正箇所は「新しい分岐を追加しただけ。(変数randが3の場合の分岐を追加)」ですね。

そうすれば、テストとしても

  1. 変数randが3の場合にその条件分岐に入るか?
    変数randが3の場合にその条件分岐内の処理が問題なく実行されるか?(変数answerに指定のセリフが入っているか?)

と2項目の内容を実際にテストしてみて問題なく動いている事を確認するだけで済みますよね?

だって、他の条件分岐のコードをいじってもないので「問題なく今まで動いていたもの」なわけなので「テストする必要なし」なわけです。

最初にちゃんと書いておけば、あとあとのテスト工数が減ってくるわけですね。

ちなみにそもそも「0と1と2」の数値での3択でなくとも「1と2と3」の数値での3択でもいいんですが、数値といえば「0から始まるのが習わし」になっているので、そうするもんだ。と思ってください。

リファクタしてみよう

jsの鬼練でもやったようにリファクタしてみましょう。

そうするとこんな感じに出来ます。

 

phpで定数を使うには2通りあってdefine()というものを使う方法とconstというものを使う方法があります。

constの方が高速ってことなんで今回はconstを使っています。

PHPで定数定義するときはdefine()よりもconstを使うべき

ちなみにdefine()でやる場合、定数に「連想配列」が使えないので注意です。

3行書かなきゃいけないし、連想配列のように一つのグループにまとめられず、定数1つ1つ個別に作るしかないです。

ちなみにPHP7からは定数にも配列や連想配列が使えるようになりました。

PHP7以降では配列と連想配列をdefineで定義できる

phpの場合では、define()やconstで作った変数名の前には$はつける必要ありません。

さらに「定数名は大文字にする」はjsと同じく「慣習」になっています。

phpでの「連想配列」の呼び出しは、配列と同じように「添字(index)」の部分を名前で指定します。

 

さらにelse-if文がどんどん今後増えてきそうなので、増えると見辛くなります。

なので、そういう時はjs鬼練でも紹介しましたが、if文を使わずに同じ「条件分岐」が出来る「switch文」を使いましょう。

判定式の部分に直接mt_rand(0, 2)も入れてその場で判定させちゃいましょう。

最後の

とかもswitch文でもいいですね。やってみましょう。

今回はここまでで。