PHPによるサーバーサイドWebプログラミングを体験する。
インストールしたディレクトリ(ふつうはC:\xampp
)の下にhtdocs
というフォルダがある。
すでにいくつかファイルやフォルダがあると思うが、全て削除して(気になる人はどこかに退避)まっさらの状態にする。
XAMPPコントロールパネルを呼び出し、Apacheを起動しておく。
アプリケーション > MAMP > htdocs で同様の作業を行う。Apacheを起動しておく。
たぶん/var/www
とか/var/www/htdocs
とかで同じことをやればいいと思う。がんばってApacheを起動しておく。
まずはApacheのファイルサーバーとしての機能を確かめる。
test.txt
とか適当なファイル(何でもいい)に適当な内容(何でもいい)を書いてhtdocs
の下に置いてみる。
http://localhost/test.txt みたいなURLでアクセスできるようになる。
あらためてきれいになったhtdocs
フォルダの下にindex.php
というファイルを作る。
テキストエディタで開き、以下のように記述する。
<?php echo 'Hello, World!'; ?>
ブラウザを立ち上げ、http://localhost/ にアクセスする。
Hello, World! と表示されたら成功。
PHPは、Webに特化したプログラミング言語であり、同時にテンプレートエンジンでもある。
コードを書かなければPHPプログラムはただのテキストファイルである。たとえば以下のように書いても Hello, World! と表示できる。
Hello, World!
ただし、 <?php ?>
で囲われた部分はPHPコードであり、このコードによって出力された文字はテキスト上に埋め込まれて表示される。
1 + 1 は <?php echo 1 + 1; ?> です。
なお、<?= ?>
を使用すると「出力された文字」ではなく評価された値が埋め込まれる。
1 + 1 は <?= 1 + 1 ?> です。
このようにPHPの本質はテンプレートエンジンだが、Webの発展とともにPHPはプログラミング言語としての性質を強めてきた。
より複雑なタスクをこなすために、PHPで数百行、数千行のコードを書くこともめずらしくない。テンプレートを吐き出すことが目的でないこのようなコードでは、ファイルの先頭を<?php
で書き始めるが、ちょっとした悲劇を避けるために?>
で閉じないのが原則である。
<?php
// フィボナッチ数
function F($n) {
if ($n < 2) {
return 1;
} else {
return F($n - 2) + F($n - 1);
}
}
return F(1000); // ☠
上のコードを見てもわかるが、PHPはC言語の文法に大きな影響を受けており、C言語に慣れ親しんでいる人は特に違和感なく書けると思う。
いくつか基本的な特徴を挙げておくと、
-
文末にはセミコロンが必要
-
動的型付け言語である。
1 + '1' === 2
-
変数名には必ず先頭に
$
をつける。逆に言えば先頭が$
であればそれは必ず変数である。 -
文字列連結の演算子は
.
である。'ho' . 'ge' === 'hoge'
-
C言語などで用いられる比較演算子
==
はPHPでは危うい。===
を使おう。'1e3' == '1000'
-
連想配列という型が存在する。
$man = [ 'name' => 'hakatashi', 'age' => 21, 'favorites' => [ 'Web', 'JavaScript', 'books' ] ]; echo $man['name']; // => 'hakatashi' echo $man['favorites'][1]; // => 'JavaScript'
この分科会はWeb分科会でありPHP分科会ではないのでこれ以上の詳しい文法に関しては触れないが、困った時は下のようなサイトで学習するとよいと思われる。
- PHP 言語リファレンス: PHPの公式リファレンス。PHPは日本語の公式文献が充実しており、このリファレンスも例を交えつつ、詳しくわかりやすく解説している。
- PHPBook: 日本語のPHP学習の鉄板となったサイト。特に初心者向けにつまづきやすいポイントを綿密に解説している。
- PHP文法最速マスター: ほかのプログラミング言語に精通している人のための最速学習。PHPをそれなりに書ける人も読んでみるとよい。
- PHP Labo
- 初心者用PHP入門
index.phpを編集して、いろいろ遊んでみる。
現在時刻
<?php date_default_timezone_set('Asia/Tokyo'); ?>
<h1>現在の時刻は <?php echo date('H:i:s'); ?> です。</h1>
フィボナッチ数
<?php
$fib1 = 0;
$fib2 = 1;
for ($i = 1; $i <= 100; $i++) {
echo "<p>F($i) = $fib2</p>";
$next = $fib1 + $fib2;
$fib1 = $fib2;
$fib2 = $next;
}
HTTPによるリクエストにはパラメータを設定することができる。
例えば、もっともわかり易い例で言うと、GETリクエストにはURLの?
のあとにパラメータを書くことでGETパラメータとすることができる。
http://www.google.co.jp/search?q=tanasinn
上の例だと、qというキーにtanasinnという値を設定している。
このパラメータは、PHPでは$_GET
変数からアクセスすることができる。
あなたは<?php echo $_GET['text']; ?>と入力しました。
http://localhsot/?text=hogehoge などにアクセスすることで動作を確かめられる。
いちいちURLをいじるのは面倒なので、HTMLのフォームから入力できるようにする。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>PHPテスト</title>
</head>
<body>
<form action="" method="get">
<input type="text" name="text">
<input type="submit">
</form>
<p>あなたは<?php echo $_GET['text']; ?>と入力しました。</p>
</body>
</html>
一週間ぐらい何すればいいか考えてたけど、なんかいい例が思いつかなかったので、とりあえず日付を受け取って曜日を計算するサイトを作ってみる。
たぶんこんな感じ。
<?php
// POSTリクエストの場合のみ処理する
if ($_SERVER["REQUEST_METHOD"] === "POST") {
// 文字列を整数に変換する
$year = intval($_POST['year']);
$month = intval($_POST['month']);
$day = intval($_POST['day']);
// なんか書く
$youbi = 'なんちゃら曜日';
} else {
$youbi = NULL;
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>日付変換サイト</title>
</head>
<body>
<?php if (!is_null($youbi)) { ?>
<p><?= $year ?>年<?= $month ?>月<?= $day ?>日は<?= $youbi ?>です。</p>
<?php } ?>
<p>日付を入力してください</p>
<form action="" method="post">
<input type="text" name="year">年
<input type="text" name="month">月
<input type="text" name="day">日
<input type="submit">
</form>
</body>
</html>
- 曜日はどうやって計算してもいい。自力で計算しなくてもいい方法もある。
- ツェラーの公式 - Wikipedia
- mktime関数でUNIXタイムスタンプ(1970-01-01からの秒数)を取得できる
- date関数を……
- 数字以外が入力された場合の処理を書く
- 小数の場合……
- 存在しない日付の場合……
- 干支を計算する
- 星座を計算する
- ついでに占っちゃう
- 六曜を計算する
- イスラム暦対応
- その日から今日までの日数を計算する
- キリ番だったらお祝いする(いつの時代だ)
- 見た目を改善する
- その月のカレンダーを表示する
- HTMLの
<table>
とか使ったらいいと思う
- HTMLの
// POSTリクエストの場合のみ処理する
if ($_SERVER["REQUEST_METHOD"] === "POST") {
// 文字列を整数に変換する
$year = intval($_POST['year']);
$month = intval($_POST['month']);
$day = intval($_POST['day']);
$Y = $year % 100;
$C = floor($year / 100);
$h = ($day + floor(26 * ($month + 1) / 10) + $Y + floor($Y / 4) - 2 * $C + floor($C / 4)) % 7;
$youbis = ['土曜日', '日曜日', '月曜日', '火曜日', '水曜日', '木曜日', '金曜日'];
$youbi = $youbis[$h];
} else {
$youbi = NULL;
}
// POSTリクエストの場合のみ処理する
if ($_SERVER["REQUEST_METHOD"] === "POST") {
// 文字列を整数に変換する
$year = intval($_POST['year']);
$month = intval($_POST['month']);
$day = intval($_POST['day']);
$time = mktime(0, 0, 0, $month, $day, $year);
$youbis = ['金曜日', '土曜日', '日曜日', '月曜日', '火曜日', '水曜日', '木曜日'];
$youbi = $youbis[$time / 60 / 60 / 24 % 7];
} else {
$youbi = NULL;
}
// POSTリクエストの場合のみ処理する
if ($_SERVER["REQUEST_METHOD"] === "POST") {
// 文字列を整数に変換する
$year = intval($_POST['year']);
$month = intval($_POST['month']);
$day = intval($_POST['day']);
$weekday = date('w', mktime(0, 0, 0, $month, $day, $year));
$youbis = ['日曜日', '月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日'];
$youbi = $youbis[$weekday];
} else {
$youbi = NULL;
}