初心者のためのプログラミングことはじめ～制御構文（PHP）～

[目次](https://qiita.com/sho0211/items/ab45f373dc219756e3d1)

# 本稿での目標

- phpでwebプログラミングの仕組みがわかる
- 制御構文のイメージがつく

# webプログラミングの準備

## webプログラミングって何？

究極的には、アクセスしたユーザに対して意図するhtmlを表示させることがwebプログラミングである。
ユーザから見た場合には動的に作られたサイトか静的に用意されたサイトなのかの区別はない。
なので、まずはphpを使ってhtmlをユーザに届ける仕組みを学ぼう。

## サーバの準備

phpでサーバというとXAMPPなどの環境が有名だが、初心者向けとしては重厚すぎて罠が多い。
したがって、簡単に構築できるビルトインサーバを利用する方法で本シリーズを進めていく。

### サーバの起動

#### [補足]サーバとは

webはユーザからの取得要求（リクエスト）に対して該当の情報を返信する（レスポンス）ことで成り立っている。
そのリクエストを受け取り、適切なレスポンスを返信するためのプログラムをwebサーバと呼ぶ。
これはwebサーバに求められる規格が決まっており、全てを自らプログラムするのでは手間なので、こうしてwebサーバプログラムと、自身の作るプログラムを分けることで手間をへらすことにしている。
apacheやnginxなどがwebサーバとして有名だが、phpがwebサーバ[^1]を内蔵しているので、開発段階では非常に簡単に利用できる。
ただし、本番運用には耐えられないものなので、くれぐれも開発・テスト時にのみ利用するものと思っていただきたい。

#### web用フォルダの作成

筆者は`C:\www`というフォルダを用意した。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152901/f120abec-7d32-4441-7cf5-2f97a3022852.png)

#### サーバ起動コマンドの作成

用意したweb用フォルダの中に`server.bat`という名前で下記のようなファイルを作る

```:server.bat
@echo off

set path=%path%;"[phpをインストールしたフォルダ]"
php -S localhost:8000
```

`set path=` の部分について、c:\phpにphpをインストールした筆者の場合は下記のようになっている。大文字小文字の区別はない。

```
set path=%path%;"c:\php"
```



#### サーバ起動

作った`server.bat`をダブルクリックしよう。

|![image.png](https://qiita-image-store.s3.amazonaws.com/0/152901/f94567de-6ef7-d8af-c763-d59ded86bbdf.png)|
|:-:|


こんな画面が立ち上がるだろうか。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152901/00df5025-c467-905d-94e9-488ae7c28236.png)
これがサーバプログラムの動作画面なので、閉じないでそのままにしておこう。
サーバを停止するときには×ボタンでウィンドウを閉じれば良い。

#### エラーに慣れよう

サーバが起動したら、何も考えずにブラウザで http://localhost:8000/error.php を開いてみよう

|![image.png](https://qiita-image-store.s3.amazonaws.com/0/152901/26f32481-0b14-434d-892f-135d4e0873bc.png)|
|:-:|

![image.png](https://qiita-image-store.s3.amazonaws.com/0/152901/e3359924-fecc-9828-13ac-8c25c077ce62.png)

このようなエラーが出ているはずだ。
ブラウザ側では「そういうURLは用意されてないよ」という意味であり、アクセスしてきたユーザに寄り添ったメッセージである。
一方でサーバ側には「そんなファイルはないよ（もしかしたらフォルダもないよ）」という意味で、開発者にとってエラーとなった原因に近いものである。

さらにもう一つ見てみよう。
次のようなファイルを作成して、先ほど作ったweb用フォルダに保存していただきたい。

```php:error.php
<?php
echo 10 / 0;
```

そしてリロードするとこんなエラーが出ているようだ[^2]

|![image.png](https://qiita-image-store.s3.amazonaws.com/0/152901/b7684b56-e503-5754-6c05-779d98dee335.png)|
|:-:|

これはゼロで割り算したから計算できないというエラーになる。
ゼロでは割れない、という中学生の頃の話がプログラムではとても身近なのだ。
ただ、これでエラーを出しても壊れることなく、調べれば解決につながることがおわかりになるのではないだろうか。


#### index.php

それでは、初めてのwebページを表示しよう。
下記内容のファイルを作成してweb用フォルダに保存する。
これから出てくるコードはすべて、コピペではなく写経（目で見て自分で打ち込む）を強くおすすめする。
自分で書いていくうちに、この部分はなんだろうなどの疑問が出てきたらしめたものである。
その疑問をまずググって、わからなければ近くの親切なエンジニアに聞くといい。

今後、phpのファイルが出てきたときには全てweb用フォルダにそのファイル名で保存することを意図するのでご注意いただきたい。

```html:index.php
<html>
  <head>
    <title>phpへようこそ</title>
  </head>
  <body>
    <h1>HTMLじゃないよ、PHPだよ</h1>
  </body>
</html>
```

こうして、http://localhost:8000 へブラウザでアクセスすると、用意したhtml、もといphpの画面が表示される。

|![image.png](https://qiita-image-store.s3.amazonaws.com/0/152901/ca8d4b26-f9af-ba0d-23d1-dfbdd7c8ce70.png)|
|:-:|


> PHPはいろいろと驚かされる言語である。
> その成り立ちからしてWebサイトの動的な拡張を意図したものであったため、通常のWebページはそのまま表示できる。
> というよりも、特殊なキーワードを持った部分以外は全てテキストとして出力するようになっている。
> したがって、今回はhtmlとしてそのまま利用可能なものをphpファイルに書くことでwebページを作ることができた。

#### PHPコードの確認

これではPHPがわからないと思うので、少しだけPHPらしくしてみよう。

```php:index.php
<html>
  <head>
    <title>phpへようこそ</title>
  </head>
  <body>
    <h1>HTMLじゃないよ、PHPだよ</h1>
    <p>現在時刻は <?php echo date('Y/m/d H:i:s')?> です</p>
  </body>
</html>
```

現在時刻の出力を付け加えたものだ。

```php
<?php somthing ?>
```

という部分が先ほど言及した特殊なキーワードである。
この中に書かれたものはPHPのプログラムとして解釈され、レスポンスを返す前に何らかの処理が行われる部分である。
そして**それ以外の場所は何も行われずそのままhtmlとして出力されている！**

保存してブラウザをリロードすると現在時刻が現れただろうか。

|![image.png](https://qiita-image-store.s3.amazonaws.com/0/152901/16a6410a-dad0-c760-f419-fdda3ffbc95c.png)|
|:-:|

あれ？　時間がおかしい？
細かいことは気にしないで、次へ行こう。[^3]

# 制御構文1

さて、PHPを使ってWebページを表示することができたので制御構文に入っていこう。

## なぜ制御構文か

多くのチュートリアルや書籍では、`Hello world`の次は変数を扱うことが多いように思う。
しかし、本稿では制御構文からすすめていく。
その理由としては、以下の通りである。

- プログラムの本質は制御構文（自動的な判断と実行）にあり、変数は便利機能に過ぎないから
- 最初に変数を覚えても、初心者にとっては何が良いのかわからないから
- プログラムを使ってできることの可能性を垣間見ることでモチベーションを維持していただきたい

## ゲームブックとプログラムの違い

[ゲームブック](https://ja.wikipedia.org/wiki/%E3%82%B2%E3%83%BC%E3%83%A0%E3%83%96%E3%83%83%E3%82%AF)というものをご存じだろうか。
筆者が小学生くらいの頃に流行ったものなので、若い諸氏には伝わらないかもしれない。
[こちら](https://www.kana-ri.com/entry/2017/08/17/113000)にゲームブックをブログで再現したものを見つけたので、興味がある方は見ていただければ雰囲気をつかめると思う。
ゲームブックは選択によって物語が変わるという点で、条件分岐を備えているという意味でプログラムに近い。
ではプログラムとの違いはなんだろうか。
端的にいえば判断・動作の主体がユーザかコンピュータかの違いである。
ゲームブックは用意された選択肢にしたがって進めていくが、例えば持っているアイテムなどをユーザが管理する。
一方で、プログラムはユーザの状況や環境など様々なものに対して条件分岐を行い、適切な動作を行うことができる。
また、ゲームブックではちょっとした差異に対しても別のルートを用意することに人の手をかけるが、プログラムではうまく作れば差異に対する動作の違いを半自動的に生成することができる。
紹介したブログでは、選択肢毎に異なるURLが用意されていることに気付くだろう。
プログラムで同様のことを行う場合には、同じURLで別の物語を進行させることができると思っていただければわかりやすいのではないだろうか。
その様子を見ていこう。

## 条件分岐

### サンプル

では、まずはサンプルコードから見ていこう。

```php:selected_job.php
<html>
  <head>
    <title>選択された職業</title>
  </head>
  <body>
    <h1>あなたの職業</h1>
    <p>
      選んだ職業は<?php echo 'warrier' ?>です。
    </p>
    <p>
      <strong>性格</strong>
      <?php if('warrier' == 'warrier'){ ?>
        何事にも基本を大事にするタイプです。
      <?php } else { ?>
        まだ性格診断ができていません。
      <?php } ?>
    </p>
  </body>
</html>
```

ブラウザで http://localhost:8000/selected_job.php を開いてみよう。

|![image.png](https://qiita-image-store.s3.amazonaws.com/0/152901/f22c27b6-4ba6-f1bd-9c30-fd24a658668d.png)|
|:-:|

では続けて少しだけ変えてみよう。

```php:selected_job.php
<html>
  <head>
    <title>選択された職業</title>
  </head>
  <body>
    <h1>あなたの職業</h1>
    <p>
      選んだ職業は<?php echo 'mage' ?>です。
    </p>
    <p>
      <strong>性格</strong>
      <?php if('warrier' == 'mage'){ ?>
        何事にも基本を大事にするタイプです。
      <?php } else { ?>
        まだ性格診断ができていません。
      <?php } ?>
    </p>
  </body>
</html>
```

|![image.png](https://qiita-image-store.s3.amazonaws.com/0/152901/9811045d-1c68-e9cb-18bf-ae38b16b1e55.png)|
|:-:|

### 解説

```php
if('warrier' == '何か')
```
の部分が条件分岐にあたる。
ここで `==` の左右が同じであれば[^4]次の中括弧`{}`で囲まれた内容が有効であり、異なれば `else` の後の`{}`内が有効であることを示している。

なので最初の例ではwarrierを選択した人向けの表示がされており、次の例ではmageを選択した人向けの表示となっている。

### ちょっとまって！

結局2つ用意するの？　という疑問に対しては、NOである。
ここでは条件分岐で動作が変わることを知っていただければ十分であった。
そしてこの条件分岐こそがプログラムで機能を作るときに大活躍するものである。
「このボタン押したときに期間内だったら特別なテキストを出して」という要求に応えるのも、突き詰めれば条件分岐の上で成り立っている[^5]。
そのときに活躍するのが変数となるので、是非続きの変数について学んでいただきたい。

## 繰り返し

次は繰り返しについて見てみよう。

### サンプル

```php:continuous_attack.php
<html>
  <head>
    <title>あなたの連続攻撃</title>
  </head>
  <body>
    <h1>あなたの連続攻撃</h1>
    <?php for($i=0; $i<3; $i++){ ?>
      <p>あなたの攻撃！</p>
    <?php } ?>
  </body>
</html>
```

http://localhost:8000/continuous_attack.php にアクセスするとこうなっているはずだ。

| ![image.png](https://qiita-image-store.s3.amazonaws.com/0/152901/83a702cc-485b-9933-570c-639fbf7896bb.png)|
|:-:|

### 解説

```php
for($i=0; $i<3; $i++)
```
ここが繰り返しの構文になっている。
呪文のようだが、まずは呪文として覚えてしまおう。
真ん中の3が繰返し回数なので、ここを変えれば100回だろうが10000回だろうがめげずに繰り返してくれる[^6]。

そしてこちらも条件分岐と同じく、変数を使うと大変便利になる。
具体的には数字のカウントアップをして、今が何回目の繰り返しなのかを知ることができる。
ここに対しては変数を覚えた後でもう一度振り返ることにする。

# まとめ

制御構文と大仰な名前がついているが、実際には条件分岐と繰り返しであった。
他にもあるが最初の頃は使うことが少ないので必要になった時点で覚えていけば良い。
そしてこれらを使えるようになると何ができるか想像できるだろうか。

例えばカレンダーを作ってみよう。
1日から31日までの日付で繰り返し、その日が土日祝日だったらcssクラスを出力して色を分けるなど、ぼんやりとでもイメージできないだろうか。
他にも初心者の登竜門である[FizzBuzz](https://ja.wikipedia.org/wiki/Fizz_Buzz)も繰り返しと条件分岐で解けるようになる。
プログラムとは、何かをきっかけにして動作が始まり、多くの要素に対して繰り返し処理をしたり、複雑な条件を利用して結果を変えていくことの組み合わせなのだ、という暴論を初心者の皆さんには眉唾程度に知っておいてもらいたい。

# 次回

[次回](https://qiita.com/sho0211/items/71821bf4bee94f45bb7a)は変数について見ていこう。

# 脚注

[^1]: 狭義ではアプリケーションサーバと呼ばれる種類のものだが、ここでは気にしないでよい。
[^2]: 驚くべきことに、クリティカルなエラーとならずにサーバ側としては正常にレスポンスを返したこととなっている。こういったところにもPHPの特性が表れる。
[^3]: これはタイムゾーンの問題で、UTCとよばれる基準時間を表示しているから。php.iniをいじったり、余分なコードを書くことで日本時間にすることができるが、本シリーズの趣旨ではないので割愛する。
[^4]: 厳密には少し意味が違うが、とりあえずのところはこのように理解していただければ問題ない。
[^5]: 条件分岐が多くなりすぎないように、データベースなどを取り入れてスマートに作るのがエンジニアの仕事でもある。条件分岐が多いと変更の難度が上がっていくことになるからである。
[^6]: 大きすぎるとなかなか返信が帰ってこないので注意が必要。辛いときにはサーバ画面（黒い画面）を×で閉じれば良い。