2008年12月1日月曜日

Zend Framework のための PHP 入門 #1

ということで,PHP ネタをやるよ〜.方向性は,Zend Framework の使い方を理解するために必要な PHP の文法とプログラミングテクニックを中心にやってく.すぐに実用できる内容ではないのが申し訳ない.PHP をすぐに実用できるレベルで教えるってのは,難しいことだと思う.なんというか,PHP は簡単ですぐに実用できるってのが世の中の流れだけど,僕はそう思えないんだよね.メールフォームとかアンケートフォームとかを作るだけなら簡単だけど,ログインしてなにかするようなものになってくると,それっぽいものはできてもセキュリティがしっかりしているものはできない.僕がつくってもそうなってしまうのだw

ということで,フレームワークとして Zend Framework を使うことを前提にして,それを扱う上で必要な PHP の文法を理解して,プログラミングの能力を高めることを中心にする.はっきり言って,つまらないと思うwwwだけど,これを読み終わったら Zend Framework を使う下準備が整ったというレベルに達しているように頑張るので,ぜひ読んでみてくれぃ.

前提とする知識として,HTML を読み書きでき,HTML ファイルをサーバにアップロードして公開できること.開発環境として,MAMP(林檎生活100: MAMP のインストール方法を参照.)を使用する.ほかの環境で勉強する際は,前述のエントリの php.ini の設定を読んで,その環境を設定すること.

さて,今回の内容は,PHP が何してるものかということについて.残念ながら PHP の表面を知っているだけでは,PHP を扱うのは難しい.トラブルが起きたときに何が問題で,何が問題でないかという切り分けができないからね.ということで,PHP がどんな風に動いているのかについて書いていく.

まずは,PHP が動いてない HTTP サーバ (Apache) の動きを図に表すと,こんなかんじになる.(正確に把握することではなくて,こういうふうに処理されているんだという感覚を掴んでほしい.)


1. リクエストを送信
2. HTML ファイルを読み込む
3. HTML ファイルの内容を送信

例えば,次のような HTML を書いた sample01.html というファイルを MAMP の /アプリケーション/MAMP/htdocs/sample01.html に置いたとする.(通常なら HTTP サーバにアップロードすることになる.)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<title>Zend Framework のための PHP 入門#1 (sample01.html)</title>
</head>
<body>
<h1>これは,sample01.html です.</h1>
</body>
</html>

そして,MAMP を起動して,ブラウザから http://localhost:8888/sample01.html にアクセスすると,「これは,sample01.html です.」と表示される.

この動作は,ユーザが localhost にある HTTP サーバに対して,(1.) sample01.html がほしいということをリクエストし,(2.) HTTP サーバが sample01.html を読み込み,(3.) ユーザに sample01.html の内容を送信していることになる.

では,PHP が入るとどうなるのか.PHP が動いている HTTP サーバの動きを図に表すと,こんなかんじになる.


1. リクエストを送信
2. PHP ファイルを読み込む
3. PHP ファイルを渡す
4. 処理した結果を返す
5. 返された結果を送信

これについても例を示そう.例えば,次のような sample02.php というファイルを前述の通りのフォルダに置く.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<title>Zend Framework のための PHP 入門#1 (sample02.php)</title>
</head>
<body>
<?php
echo "<h1>これは,sample02.php です.</h1>\n";
?>
</body>
</html>

そして,http://localhost:8888/sample02.php にアクセスすると,「これは,sample02.php です.」と表示される.

この動作は,ユーザが localhost にある HTTP サーバに対して,(1.) sample02.php がほしいということをリクエストし,(2.) HTTP サーバが sample02.php を読み込み,(3.) sample02.php を PHP モジュールに渡し,PHP モジュールがファイルのスクリプト部分を実行することで,echo で出力された<h1>これは〜の文字列にスクリプトが置き換えられ,(4.) その結果を HTTP サーバに戻し,(5.) HTTP サーバがユーザにその結果を送信していることになる.

単純に言えば,sample02.php の中の PHP スクリプト部分を実行して,出力された結果を置き換えたテキストデータを,ユーザに送信していることになる.PHP のやっていることの本質は,基本的にこれだけなのだ.sample02.php を sample01.html に書き換えるような作業と言っても差し支えない.それが,リクエストがあるたびに毎回行われている.この書き換えられる感覚を忘れないでほしい.

さて,これだけでは毎回同じ結果になるので,まったく意味がない.実際には,状態(これは,クライアントから送信されたデータだったり,サーバのファイルだったり,サーバの時刻だったり,クッキーだったり,データベースだったりする.)によって,振る舞い(スクリプトの出力や状態の変更.)が変わることで,Web アプリケーションが実現できている.それを図に表すと次のようになる.



この場合の例は,次のようになる.次のようなコードを記述した sample03.php というファイルを前述の通りのフォルダに置く.ソースの内容を気にする必要はまったくないからね.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<title>Zend Framework のための PHP 入門#1 (sample03.php)</title>
</head>
<body>
<?php
echo "<h1>これは,{$_GET['filename']} です.</h1>\n";
?>
</body>
</html>

そして,http://localhost:8888/sample03.php?filename=sample03.php にアクセスしてみよう.ここで注意すべきなのは,GET パラメータが付加されていることだ.filename が sample03.php ですよというパラメータが付加されている.

さらに,http://localhost:8888/sample03.php?filename=abcdefを実行してみよう.そうすると,「これは,abcdef です.」と表示されるはずだ.つまり,ユーザの入力によって動作が変わっていることがわかると思う.今回は,入力内容をそのまま表示しているだけだが,この入力内容に応じて様々な動作ができるようになる.この入力自体も HTML のフォームからの入力であったり,Flash からの入力であったりといろいろ考えられる.ただ,あくまで PHP の本質は,図に表したものだと言うことを忘れないでほしい.

ついでに,http://localhost:8888/sample03.phpでアクセスしてみてほしい.エラーメッセージ「Notice: Undefined index: filename in /Applications/MAMP/htdocs/sample03.php on line 10」とともに「これは, です.」と表示されると思う.(エラーメッセージが表示されない場合は,php.ini の設定がエラーメッセージを表示しないようになってるためだと思う.)これは,パラメータがないのに内部でそのパラメータを参照しているために表示されるエラーメッセージだ.(Notice になっているので,正確には通知メッセージかな.)こういう状況でも,エラーが出ないように,エラー処理を中でやらなければならないんだけど,今回は省略している.こういうメッセージが出るようなプログラムを組んでしまったときは,無視せずにエラーメッセージがでないようにプログラムを修正しようねw

こんなかんじで,1回目の内容は終わり.わかっていただけただろうか?1番言いたいのは,PHP のやっていることは図に表した通り単純で,ほかの周辺技術と分けて考えてほしいということ.それさえ掴めれば,必要な周辺技術の勉強をちょこっとするだけで,PHP とシームレスに連携できる.なぜなら,どんな周辺技術にしろ,そこから取得したデータを PHP で処理することは変わらないから.データを取得したあとの処理方法って,PHP をきちんと理解していればどうにかなるし,PHP を理解していなければどうにもならないのだ.

ということで,次回からは PHP の文法まわりをやっていくのでよろしく.おそらく,次回からはもっとつまらなくなると思うwww

追記(2008年12月7日):
$_GET['filename'] のアンダーバーが抜けていたのを修正.

4 件のコメント:

yamabiko さんのコメント...

いいですねー!文法とか俺はだいぶ好きです♪
あと,Zend Framework のコーディング規約準拠でお願いしますw

Takuya Tsuchida さんのコメント...

>yamabiko
準拠する努力はするよw

匿名 さんのコメント...

おっ!ついに始まったね~楽しみにしてるよ☆

Takuya Tsuchida さんのコメント...

2回目までは,時間が空くと思いますが,ぜひ読んでみてください.