Skip to content

Instantly share code, notes, and snippets.

@hakatashi hakatashi/sig-web-02.md
Last active May 18, 2016

Embed
What would you like to do?
TSG 第2回Web分科会

TSG 第2回Web分科会 カンペ

PHPによるサーバーサイドWebプログラミングを体験する。

Hello, World!

XAMPPを使用する場合

インストールしたディレクトリ(ふつうはC:\xampp)の下にhtdocsというフォルダがある。

すでにいくつかファイルやフォルダがあると思うが、全て削除して(気になる人はどこかに退避)まっさらの状態にする。

XAMPPコントロールパネルを呼び出し、Apacheを起動しておく。

MAMPを使用する場合

アプリケーション > MAMP > htdocs で同様の作業を行う。Apacheを起動しておく。

その他Linux環境の場合

たぶん/var/wwwとか/var/www/htdocsとかで同じことをやればいいと思う。がんばってApacheを起動しておく。

準備ができたら

まずはApacheのファイルサーバーとしての機能を確かめる。

test.txtとか適当なファイル(何でもいい)に適当な内容(何でもいい)を書いてhtdocsの下に置いてみる。

http://localhost/test.txt みたいなURLでアクセスできるようになる。

Hello, World!

あらためてきれいになったhtdocsフォルダの下にindex.phpというファイルを作る。

テキストエディタで開き、以下のように記述する。

<?php echo 'Hello, World!'; ?>

ブラウザを立ち上げ、http://localhost/ にアクセスする。

Hello, World! と表示されたら成功。

PHPとは何か

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文法

上のコードを見てもわかるが、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>

ヒント

余力があったら

  • 数字以外が入力された場合の処理を書く
    • 小数の場合……
    • 存在しない日付の場合……
  • 干支を計算する
  • 星座を計算する
    • ついでに占っちゃう
  • 六曜を計算する
  • イスラム暦対応
  • その日から今日までの日数を計算する
    • キリ番だったらお祝いする(いつの時代だ)
  • 見た目を改善する
  • その月のカレンダーを表示する
    • HTMLの<table>とか使ったらいいと思う

実装例

ツェラーの公式を使用する方法

// 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;
}

mktime関数を使用する方法

// 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;
}

date関数を使用する方法

// 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;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.