動的にホームページを作るPHPをはじめよう!
PHPとは
PHPはサーバーサイドで動的にホームページを作成するのに使われているプログラミング言語です。
ホームページはWebブラウザがサーバにあるHTMLファイルを読み込んで画面に表示されます。
このHTMLを手動で作成してサーバーに置くのではなく、サーバでPHPプログラムが作成するので動的に変化した内容を作成することができます。
ホームページは一度作成したら余り内容を変更しない部分よりも、頻繁に内容が変更されるブログ記事や掲示板、SNSサイトなどを表示することが多いです。
また、ちょっとしたデザインやページ構成の変更なども手動でHTMLを作成するよりプログラムを用いてHTMLを作成するほうが効率よくできます。
代表的なものとして今世界の約6割のサイトが利用していると言われているWordPressもこのPHPで作成されています。
なので、WordPressでホームページを作成する際にもPHPを使う機会が多くあります。
PHPの動作環境
サーバーサイドで動作するスクリプト言語として利用されていて、ApacheやNginxいったWebサーバーから実行することができます。
つまり、WebサーバーにPHPの動作環境があれば実行できるのです。
言い換えればPHPを動かすにはWebサーバーが必要であると思っていいかと思います。
通常はパソコンに動作環境があるものではないので、パソコンの閉じた環境で学習するにはXAMPPやMAMPのようなソフトを使って、PHPの動作するWebサーバー環境を作って動作させます。(XAMPPやMAMPの環境構築方法についてはそれぞれのブログ記事を参照ください)
また、他のプログラミング言語と同じく動作確認サイトを使えば、パソコンに動作環境を作らずともサイト内に直接プログラムを記述して動作確認できます。
ほぼ全ての主要言語が使用できます。英語サイトですが、こちらも画面が大きく見やすいです。
スマホなどのデバイスごとの表示を切り替えることができます。
ほぼ全ての主要言語が使用できます。英語サイトです。
codinggroundのようなターミナルは表示されません。
家庭内でファイル共有するためにNASを設置している人もいるかと思います。
最近のNASは機能も充実していてWebサーバー機能があって、PHPやMySQL/MariaDBなども動作できるものも多いです。
これらが動作するNASを持っている方は、NASを使うことで動作確認も比較的容易にできると思います。
記述方法と特徴
PHPは「<?php」と「?>」で囲まれた部分をコードと認識して実行します。
Webブラウザがページを読み込む時に、その中に<?php ~ ?>と囲まれたコードがあればPHPプログラムとして実行します。
基本的にPHPプログラムは、拡張子が.phpのファイルに記述します。
Webサーバーは読み込むデータの種類をファイル種類で識別しています。
設定によっては読み込むページがHTMLファイルであっても、その中に<?php ~ ?>と囲まれた部分があればそこをPHPプログラムとして実行することもできます。
また、読み込むファイルの最後が「?>」で終わる場合は、この「?>」は省略できます。
プログラム文の特徴は以下です。
・クラス、メソッド、関数、制御文は{}で囲みます。
<body>
<?php
if ($title) {
?>
<h2><?php echo $title; ?></h2>
<?php
}
</body>
この後も説明ありますが、制御文は「:(コロン)」で区切る記述もできます。
<body>
<?php if ($title) : ?>
<h2><?php echo $title; ?></h2>
<?php else: ?>
<h2>普段のタイトル</h2>
<?php endif; ?>
</body>
・コマンド文は;で終わります。
echo "Hello World";
PHPプログラム
動作確認サイトを使っている場合はそこに直接PHPプログラムを書いていきます。
それ以外はPHPが動作するWebサーバーにブラウザが読み込むページにPHPプログラムを書いていきます。
エディタを使って.phpファイルを作成します。
ファイル名は何でもいいですが、ここではsample.phpとしておきましょう。
Webブラウザでsample.phpを読み込んで動作を確認していきます。
それでは、画面に「Hello World」と表示してみましょう。
画面に文字を表示するにはechoと呼ばれる関数を使います。
他のプログラミング言語にあるようなprintf()関数もありますが、PHPの場合は単純な文字列を表示するのは多くの場合このechoが使われます。
<?php echo "Hello World"; ?>
数値を直接表示することもできます。
<?php echo 1000; ?>
変数
PHPも変数の型はありますが、明確に型を宣言することはありません。
型は示しませんが、文字列の先頭に「$」を付けることで変数であることを明確にします。
以下は変数$titleに”Hello World”という文字列を代入しています。
$title = "Hello World";
ダブルクォーテーション、シングルクォーテーションのどちらでも文字列を表現できます。
$title = 'Hello World';
数値も代入することができます。以下は変数$numに196を代入しています。
$num = 196;
PHPは明確な型宣言がなく文字列と数値を同じように扱うことができます。
例えば、文字列と数値がそれぞれ代入されている変数を連結して画面に表示することもできます。
echo $title . ", " . $num . " countries";
文字列は「.」で連結します。
これを実行するとブラウザに「Hello World, 196 countries」と表示されたかと思います。
数値を直接書いて連結することもできますが、数値と「.」の間にスペースを空けないと小数点のある数値と見なされます。
echo $title . ", " . 196 . " countries";
ややこしくてミスもし易いので、こういったプログラミングは避けるべきでしょう。
文字列はダブルもシングルもどちらのクォーテーションでも表現できますが、使い方の違いがあります。
ダブルクォーテーションは”~”で囲まれた中で変数を使えます。
シングルクォーテーションはすべて文字列として認識されます。
例えば上のecho文は以下のように書くこともできます。
echo "$title, $num counties";
(表示結果)Hello World, 196 countries
これをシングルクォーテーションにして実行すると変数名も文字として表示されると思います。
echo '$title, $num countries';
(表示結果)$title, $num countries
このようにPHPでは文字列と数値を混在して扱うことができます。
便利な反面、思った動作にならないようなコーディングをしてしまう場合があるので気をつけましょう。
変数に使える代表的な型は以下です。
- 真偽値:trueもしくはfalse
- NULL:null値としての空データ
- 数値:10や3.14などの整数/浮動小数点数
- 文字列:”Hello World”など
- 配列:[“Tokyo”, “Osaka”, “Nagoya”]など
PHPも他の言語と同じくコメント行を書くことができます。1行をコメントにする場合は「//」を使います。
複数行もしくは部分的にコメントを指定するときは「/* ~ */」で囲みます。
// これはコメントです
echo "$title, $num counties";
/* 部分的に */
/*
もしくは複数行の
コメントです
*/
演算子
変数に格納されている値を計算したり、期待通りの値かどうかを評価したり、または文字列を連結したり、関数の結果を評価するときに使われます。
加減算 |
“+”, “-“ |
乗算 |
“*” |
除算 |
“/” |
インクリメント |
“++” |
デクリメント |
“–“ |
剰余算 |
“%” |
等号 |
“==” |
不等号 |
“!=” |
比較 |
“>=”, “<=”, “>”, “<“ |
論理積 |
“&&” |
論理和 |
“||” |
否定 |
“!” |
用例と説明
【加減算、乗算、除算】
足し算”+”、引き算”-“、掛け算”*”、割り算”/”を行うときの演算子です。
a = 4 + 3; // aの結果は7です。
b = "Hello" . "World"; // bの結果はHello Worldです。
*PHPは「.」で文字列を連結します。
【剰余算】
割り算したときの余りを求める演算子”%”です。
a = 7 % 3; // aの結果は1(ture)です。
b = i % 3; // この例は、bの結果が0の場合はiは3で割り切れる値なので、iは3の倍数であることがわかります。
【インクリメント、デクリメント】
変数の値を1増加”++”したり、1減算”–“する演算子です。
変数の前に記述するのと後に記述するので意味が変わります。
a = ++i; // aの結果はiを1増加した値です。a = (i += 1);と同じです。
a = i++; // aの結果はiと同じです。aにiを代入したあとでiを1増加します。a = i; i = i + 1;と同じです。
【等号、不等号、比較】
値を比較するときの演算子です。
同じかどうか比較する場合は”==”、同じではないことを比較する場合は”!=”、大きさを比較する場合は”>=”, “<=”, “>”, “<“を使います。条件文とともに使います。
if (x == y) // xとyが等しければ実行します。
if (x != y) // xとyが等しくなければ実行します。
比較の判定は「真偽値」で行います。つまり「x == y」が成立するときは「真(true)」、そうでなければ「偽(false)」という値となります。
これはどのプログラミング言語でも必ず登場するので知っておきましょう。
関数の戻り値として型定義されていることも多く、プログラミング言語によっては「boolean型」として明確に型定義をします。
例えば、isActive(引数)といった関数があるとして、この関数では(引数)で渡されたものが有効かどうか?を判定する処理を行い、戻り値として真(true)か偽(false)を返します。
関数ではこうやって利用されることが多いです。
等号と不等号はプログラミング言語によって、”===”や”!==”という記述方法を提供しているものもあります。
これは、より厳密に等号や不等号を比較する場合に使用する演算子です。
PHPはif (a == 1)とif (a == ‘1’)はどちらも同じ判定となります。
ですが、if (a === 1)とif (a === ‘1’)は判定が異なります。if (a === 1)の場合はaが数値の1ならば実行します。if (a === ‘1’)はaが文字列の’1’ならば実行します。
「==」「===」の違いを確認できる比較表はこちらを参考にしてください。
http://php.net/manual/ja/types.comparisons.php
if (x >= y) // xがy以上であれば実行します。
if (x < y) {
// xがyより小さいときに"Hello World"を表示します。
echo "Hello World";
}
【論理積、論理和、否定】
これは条件をより簡潔に表現するのに使う演算子です。なので条件文とともに使われます。
「〜かつ〜」であることを判定する場合は論理積” && “、「〜もしくは〜」であることを判定する場合は論理和”||”、「〜でない」ことを判定する場合は否定”!”を使います。
if ((x == 7) && (y == 3)) // xが7で、かつyが3であるときに実行します。
if ((x != 5) || (y == 10)) // xが5でないか、もしくはyが10のときに実行します。
if (!func()) // func処理の結果がfalse(偽)の場合に実行します。
true(真)とfalse(偽)は真偽値といって、ここでは処理結果が”1″ならばtrue(真)、”0″ならばfalse(偽)と理解しておくといいでしょう。
上記の例の場合だと、「func処理結果が”0″ならば実行する」ということになります。
「func処理結果が”1″である」ことを評価するには、if (func())と記述します。
つまり、否定”!”は真偽値を反転させて評価します。
配列
PHPで配列を使うには以下のようにします。
$week = array( 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' );
配列から値を取り出すには以下のようにインデックスを指定します。
echo $week[0];
(表示結果)'Sun'
PHPはインデックスを名前にする連想配列を使うことができます。
連想配列を使うには以下のようにします。
$img = array( 'url' => 'http://sample.jp/sample.jpg', 'width' => '640', 'height' => '480' );
連想配列から値を取り出すには以下のように要素名を指定します。
echo $img[width];
(表示結果)'640'
配列へ要素を追加するには、+演算子もしくはarray_merge()関数を使います。
+演算子の場合
$arg = array( 'key1' => 'val1' );
$arg += array( 'key2' => 'val2' );
var_dump($arg);
(表示結果)
array(2) {
["key1"]=>
string(4) "val1"
["key2"]=>
string(4) "val2"
}
var_dump()関数は変数に格納されている情報(型と値)の全てを出力します。
array_merge()の場合
$arg = array( 'key1' => 'val1' );
$arg = array_merge( $arg, array( 'key2' => 'val2' ));
var_dump($arg);
(表示結果)
array(2) {
["key1"]=>
string(4) "val1"
["key2"]=>
string(4) "val2"
}
条件文
PHPの条件文はif文とswitch文があります。
if文
式には真偽値を判定する式を記述します。
この場合、結果がtrueの場合はif文内を処理し、falseの場合はelse文内を処理します。
if (式) {
処理内容;
} else {
処理内容;
}
複数のif文を記述することもできます。
if (式) {
処理内容;
} elseif (式) { // elseifとスペースを入れず1つの単語で記述します
処理内容;
} else {
処理内容;
}
if (x == y) {
// xとyが同じなら処理を実行
}
PHPのif文は「:」を使った記述方法もあります。
この場合はif文の最後に必ず「endif;」文を記述します。
if (式):
処理内容;
elseif (式):
処理内容;
else:
処理内容;
endif;
また、3項演算式を書くこともできます。
式 ? 値 : 値;
$door = age > 20 ? "開く" : "閉じる";
echo $door;
PHPは以下の値をfalseに評価します。
- false
- 値の入っていない、もしくは未定義の変数
- 要素の入っていない配列
- null
- 0
- ‘0’の文字列(※PHPでは数値が0でも文字列が”0″でもfalseに評価します。)
- 空の文字列(“”)
これら以外はtrueに評価します。
switch文
式に合致したcaseの値があった場合はその処理内容を実行しbreakにてswitch文から抜け出します。
どのcaseの値にも当てはまらない場合は、default内の処理が実行されます。
switch (式) {
case 値:
処理内容;
break;
case 値:
処理内容;
break;
default:
処理内容;
break;
}
例)
switch (sweets) {
case "Cake":
// sweetsがCakeの場合は処理を実行
break;
case "Chocolate":
// sweetsがChocolateの場合は処理を実行
break;
default:
// どのcaseにも当てはまらない場合処理を実行
break;
}
PHPのswitch文は「:」を使った記述方法もあります。
この場合はswitch文の最後に必ず「endswitch;」文を記述します。
switch (式):
case 値:
処理内容;
break;
case 値:
処理内容;
break;
default:
処理内容;
break;
endswitch;
繰り返し文
PHPの繰り返し文はwhile文、do while文、for文、foreach文があります。
while文
式には真偽値を判定する式を記述します。
結果がtrueの間はwhile文内の繰り返し処理を実行します。
while (式) {
処理内容;
}
例)
while (x == y) {
// xとyが同じ間は処理を繰り返し
}
PHPのwhile文は「:」を使った記述方法もあります。
この場合はwhile文の最後に必ず「endwhile;」文を記述します。
while (式):
処理内容;
endwhile;
do while文
do while文は一度でもdo文内の処理を実行したい場合に使用します。
式には真偽値を判定する式を記述します。
結果がtrueの場合再びdo文の処理を実行します。
do {
処理内容;
} while (式);
例)
do {
// 一度do文内の処理を実行し、xとyが同じ場合は再びdo文内の処理を実行
} while (x == y);
for文
for文内の処理を実行する前に初期化を行います。
そして条件がtrueの場合はfor文内の処理を実行します。
処理実行後に更新の記述内容を実行します。
そして再び条件の判定に戻り、trueの場合はfor文内の処理を実行します。
これを繰り返し、条件がfalseになればfor文を抜けます。
for (初期化; 条件; 更新) {
処理内容;
}
例)
for (var i = 0; i <= 100; i++) {
// 初期値として変数iを0をセットし、iが100より小さい場合for文内を処理し、iをインクリメントする
// iが100より小さい間は処理を繰り返す
}
PHPのfor文は「:」を使った記述方法もあります。
この場合はfor文の最後に必ず「endfor;」文を記述します。
for (初期化; 条件; 更新):
処理内容;
endfor;
foreach文
foreach文は配列を反復処理するのに使う繰り返し文です。
foreachが使えるのは配列とオブジェクトです。
構文は配列もしくは連想配列を扱う2種類があります。
foreach ( 配列 as 値 ) {
処理内容;
}
もしくは、
foreach (配列 as 要素名=>値 ) {
処理内容;
}
例)
foreach ( $args as $value ) {
// 配列($args)から1つづつの値($value)を処理;
}
foreach ( $args as $key=>$value ) {
// 配列($args)から1つづつの要素名($key)と値($value)を処理;
}
PHPのforeach文は「:」を使った記述方法もあります。
この場合はforeach文の最後に必ず「endforeach;」文を記述します。
foreach ( 配列 as 値 ):
処理内容;
endforeach;
FizzBuzz問題プログラム
FizzBuzzは海外の言葉遊びで、スタートして1から順に数字を発言していくのですが、3で割り切れる場合はFizz、5で割り切れる場合はBuzz、両方で割り切れる場合はFizzBuzzと発言します。
これをプログラミングしてみましょう。
エディタを使って編集してFizzBuzz.phpという保存してブラウザで表示してみましょう。
プログラム全体の動作を以下のようにします。
- 1から順に100までカウントする
- 数える数字を1行ずつ画面に表示する
- 3で割り切れる数字のときは画面に「Fizz」を表示する
- 5で割り切れる数字のときは画面に「Buzz」を表示する
- 3と5で割り切れる数字のときは画面に「FizzBuzz」を表示する
for文を使って繰り返し処理を行うプログラムを考えてみましょう。
数字をカウントしながら、その数字を画面に表示するので、表示処理を100回繰り返すプログラムを記述します。
for ($i = 1; $i < 101; $i++) {
}
処理を100回繰り返すプログラムをfor文で書くとこのようになります。
- 「$i = 1;」でi変数を宣言し、初期値に1を代入 します。
- 「$i < 101;」はi変数が101より小さい間処理をする条件となります。1から100まで数えるので、i変数が100のときも画面に表示します。
- 「$i++」はfor文内の処理の最後に実行します。この場合は画面に表示したあとにiがインクリメントされます。
- echo関数でブラウザに表示します。
for ($i = 1; $i < 101; $i++) {
echo "$i<br>";
}
HTML表記で改行は”<br>”です。PHPは動的にHTMLを作成してブラウザが表示をします。
ブラウザに表示される文字を改行するには”<br>”を出力します。
次に、3で割り切れるときは「Fizz」、5で割り切れるときは「Buzz」、両方で割り切れるときは「FizzBuzz」、それ以外は数字を表示するようにプログラムを書きます。
if ($i % 3 == 0 && $i % 5 == 0) {
} elseif ($i % 5 == 0) {
} elseif ($i % 3 == 0) {
} else {
}
「%」は割り切れると「0」を返す演算子です。3と5で割り切れるかどうかを「==」で評価しています。各条件文にそれぞれの文字列を表示する関数を記述し、FizzBuzzクラスに定義します。
<?php
for ($i = 1; $i < 101; $i++) {
if ($i % 3 == 0 && $i % 5 == 0) {
echo "FizzBuzz<br>";
} elseif ($i % 5 == 0) {
echo "Buzz<br>";
} elseif ($i % 3 == 0) {
echo "Fizz<br>";
} else {
echo "$i<br>";
}
}
?>
保存したFizzBuzz.phpファイルをブラウザで読み込むと以下のように表示されましたか?
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
...
プログラムはパズルを組み立てたり、なぞなぞを解いたりするのに感覚的に似ていませんか?
「はじめてのプログラミング」記事で少し触れましたが、パズルやなぞなぞが好きな人はプログラミングの習得が比較的速いかも知れません。
プログラミングは試行錯誤したあとに完成させることで達成感があります。
これをきっかけにPHPを学習してみてください。