フレームワーク研究
フレームワークは一言で表すと、アプリケーションの土台」と言えます
。データベースへの接続、認証機構の実装、データの登録・編集・削除ページの作成など、どんなWebアプリケーションにも必須の機能があります。これらの開発を毎回1から行うことは非常に効率が悪いことです。フレームワークはこれらの機能を一つにまとめ、その組み合わせ方も提供します。言わば、コードの規格書とも言えるでしょう。
フレームワークは、プレゼンテーション層とビジネスロジック層の分離、コントロールの標準化、標準的な処理(フォームの生成や値の取得など)の自動化など、Webアプリケーション構築に有用な機能を提供します。スキームが固まるため、セキュリティ対策にも効果があります。
フレームワークは、今後ますますPHP開発に不可欠なものになると考えられていますが、フレームワーク使用法のマスター方法、数多くあるフレームワークの中からどれを選択するかなどさまざまな問題があるのも事実です。
フレームワークは下記のようなシステム開発における問題に対して有用です。
つまり、フレームワークはアプリケーション開発の問題に対処するための下記のような特徴を持ちます。
- 命名規則やディレクトリ構成などの規則が統一されており、大規模な開発に向いている
- コードの再利用性が高いため、効率的な開発を行える
- 開発に制約を設けることで、セキュリティ・保守性が高まる
大規模プロジェクトには多くの開発者が関与します。このようなケースでは開発者同士のスクリプトの差異の問題から、一定の品質を保つことが難しくなります。このような問題がバグ発生率の増加、スクリプトの複雑化に繋がり、開発期間の延長の原因となっています。
フレームワークはコーディングのルールや実装方法を均一化するため、このような開発期間の延長の原因を取り除きます。更に、均一化されたスクリプトにより、保守・メンテナンス性も向上します。
このようにフレームワークを使用する上で非常に便利と言われるフレームワークにも下記のように留意すべき点があります。
拡張の問題
拡張の問題とは、枠組を外れた機能の実装が困難となるケースがある点です。つまり、アプリケーションを拡張する際に、フレームワークが提供する仕組みに沿った形で行う必要がでてくるのですが、拡張の仕組みが複雑なフレームワーク、あるいは拡張しようとしている機能が複雑だと、それを実装するために逆に開発日数がかかってしまい、より多くのコストが必要になる場合があります。
習得期間
フレームワークは習得し始めてから数週間~1ヶ月は、全く新しい言語を使用しているような感覚になると言われています。これは手順、規約など、そのフレームワークに即して習得しなければならず、たとえば、データベースの命名、クラス、ファイルの配置など、さまざまなルールを覚えなくてはいけません。フレームワークに慣れてしまえば難しいことはないのですが、それまでは苦労することがあるかもしれません。
デファクトスタンダードの不在と開発の停止
現在さまざまなPHPのフレームワークが公開されていますが、その中で特出したもの、デファクトスタンダードがありません。また、中には途中で開発が停止してしまうフレームワークもあります。
PHPでめっちゃ出てくるforeach研究
foreach文は配列に含まれる各要素の値を順に取り出し処理したい場合に便利な文です。書式は次のようになっています。
foreach(配列変数 as 変数 ){
実行する処理1;
実行する処理2;
}
要素を取り出す配列と、取り出した要素の値を格納する変数を指定します。foreach文による繰り返しでは、配列に含まれる要素の数だけ繰り返しが行われ、1回繰り返しが行われるたびに配列に含まれる要素の値を変数に代入します。
具体的な例で考えてみます。
$preflist = array('東京', '大阪', '名古屋'); foreach ($preflist as $pref){ print $pref; }
1) 配列「preflist」から要素の値「東京」を変数「pref」に代入 2) 変数「pref」の値を出力 3) ブロックの最後に達したのでforeach文の先頭に戻る 4) 配列「preflist」から要素の値「大阪」を変数「pref」に代入 5) 変数「pref」の値を出力 6) ブロックの最後に達したのでforeach文の先頭に戻る 7) 配列「preflist」から要素の値「名古屋」を変数「pref」に代入 8) 変数「pref」の値を出力 9) ブロックの最後に達したが、配列に含まれる要素の数だけ繰り返しを行っ たのでforeach文を終了
foreach(A as B)
はAをBに代入するという意味
1つのクッキーに複数の値を格納する
1つのサーバからクライアントに送ることが出来るクッキーは1つだけではありません。例えば下記のように複数のクッキーを送ることが出来ます。
setcookie("user", "yamada"); setcookie("pass", "pass");
ただし、クライアントは1つのサーバから受け取ることが出来るクッキーは最大20個まで、全体でも合計300個までのクッキーしか保持できないことになっています。その為、多くのクッキーを利用したい場合には工夫が必要となります。
20個以上のクッキーを送りたい場合には、クッキー名を配列のように扱い、配列の各要素に値をセットします。
setcookie("buy[1]", "Televison"); setcookie("buy[2]", "Video"); setcookie("buy[3]", "Audio");
このようにすると、クッキー名としては「buy」だけが使われますので1つしかクッキーを消費しません。
取り出す時は次のように行います。
$val = $_COOKIE['cookie']; print($val[1]); print($val[2]); print($val[3]);
サンプルプログラム
では試してみましょう。
<?php setcookie ("buy[1]", "Televison"); setcookie ("buy[2]", "Video"); setcookie ("buy[3]", "Audio"); ?> <html> <head><title>PHP TEST</title></head> <body> <?php if (isset($_COOKIE["buy"])){ $val = $_COOKIE["buy"]; print('<p>'); print('購入したものは下記の通りです<br>'); print($val[1].'<br>'); print($val[2].'<br>'); print($val[3]); print('</p>'); }else{ print('<p>値をセットしました</p>'); } ?> </body> </html>
上記ファイルをWWWサーバに設置しブラウザ経由で見ると下記のように表示されます。
ブラウザで再読み込みをすると次のように表示されます。
クッキーを削除する研究
クッキーは必要なくなったら削除できます。不要なクッキーは出来る限り削除しておきましょう。
クッキーを削除するためには、有効期限を昔の時間に設定することで削除します。例えば下記のようにします。
time() - 1800
では試してみます。下記では3回アクセスがあったらクッキーを削除してみます。
<?php if (isset($_COOKIE["visited"])){ $count = $_COOKIE["visited"] + 1; }else{ $count = 1; } if ($count > 3){ setcookie("visited", $count, time() - 1800); }else{ setcookie("visited", $count); } ?> <html> <head><title>PHP TEST</title></head> <body> <?php print('<p>訪問回数は'.$count.'回目です</p>'); ?> </body> </html>
上記ファイルをWWWサーバに設置しブラウザ経由で見ると下記のように表示されます。
4回目も表示はされますが、この時点でクッキーは削除されています。
再度再読み込みをするとクッキーが削除されていますので、初期化されて表示されます。
クッキーの有効期限の設定
クッキーは有効期限を指定しない場合、クライアント側のブラウザが閉じてしまうと消えてしまいます。
ブラウザが閉じてもクッキーを一定期間残しておきたい場合には明示的に有効期限を設定します。
有効期限はsetcookie関数の3番目の引数で指定します。
指定する値はUNIX標準時1970年1月1日からの秒数で指定することになっているため、まず現在時刻のUNIX標準時からの経過秒数を取得し、有効期限を設定したい時間を秒に換算した値を加算して設定すると言う手順になります。
現在時刻のUNIX標準時からの経過秒数はtime関数で取得出来ますので、実際には下記のように行います。
(time関数については『日時を取得する(time, date)』を参照して下さい)
有効期限を今から3日間にする場合
time() + 259200
259200 = 60(秒) * 60(分) * 24(時間) * 3(日)
<?php if (isset($_COOKIE["visited"])){ $count = $_COOKIE["visited"] + 1; }else{ $count = 1; } $flag = setcookie("visited", $count, time() + 180); ?> <html> <head><title>PHP TEST</title></head> <body> <?php print('<p>訪問回数は'.$count.'回目です</p>'); ?> </body> </html>
上記ファイルをWWWサーバに設置しブラウザ経由で見ると下記のように表示されます。下記は数回再読み込みを行っています。
このまま3分以上待ってから、再度ブラウザで再読み込みを行うと有効期限が切れてクッキーが消えます。
クッキーの読み込み研究
次にクライアント側に保存したクッキーを読み取ってみます。
読み取るとは言ってもクライアント側のハードディスクの中身を見に行くわけではありません。クッキーがあるサーバによって保存された時、次に同じサーバに対してアクセスすると、そのサーバによって保存されたクッキーを環境変数としてサーバへ送ります。サーバ側ではクライアントからページの要求などがあった時にクッキーが合わせて送られてきているかを確認するというわけです。
クライアントからクッキーが送られてきたかどうかを調べるには、PHPで定義済みの変数「$_COOKIE」を使うことで確認できます。「$_COOKIE」は連想配列となっており、サーバに送られてきた全てのクッキーが格納された配列です。特定のクッキーの値を調べるには下記のように行います。
$val = $_COOKIE["クッキーの名前"]
例えば前のページで利用した"visited"という名前のクッキーの値を取り出したい場合には次のように記述します。
$val = $_COOKIE["visited"]
では実際に試してみます。下記ではまずクッキーの値を調べて、クッキーが送られてきていなければ初期値をクッキーに保存し、クッキーが保存されていたら値を取り出して1追加します。(isset関数については『変数が存在するかどうかの判別(isset)』を参照して下さい)。
<?php
if (isset($_COOKIE["visited"])){ $count = $_COOKIE["visited"] + 1; }else{
$count = 1;
}
$flag = setcookie("visited", $count);
?>
<html>
<head><title>PHP TEST</title></head>
<body>
<?php
print('<p>訪問回数は'.$count.'回目です</p>');
?>
</body>
</html>
上記ファイルをWWWサーバに設置しブラウザ経由で見ると下記のように表示されます。
ブラウザで再読み込みなどを行うと下記のように訪問回数が増えて行きます。
クッキーの送信研究
クッキーはクライアント側にデータを保存するためのものです。
例えば一度ホームページを閲覧したクライアントに対してクッキーを送信して保存しておいてもらえば、次にホームページにアクセスがあった時にクッキーがあるかどうかを確認することで初めての訪問者なのかどうか調べることができます。
setcookie関数を使って用いる。
setcookie bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, int secure]]]]] )
setcookie() は、その他のヘッダ情報と共に 送信するクッキーを定義します。
ほかのヘッダ情報と同様に、 クッキーは、スクリプトによる他のあらゆる出力 よりも前に送信される必要があります。
もしもこの関数をコールする前に何らか の出力がある場合には、setcookie()は失敗し FALSE を返します。
setcookie() が正常に実行されると、TRUE を返します。
この関数はユーザーがクッキーを受 け入れたかどうかを示すことはしません。
パラメータ: name
クッキーの名前 value
クッキーの値 expire
クッキーの有効期限 path
サーバー上での、クッキーを有効としたいパス domain クッキーが有効なドメイン secure 1をセットすると セキュアなHTTPS接続の場合にのみクッキーが 送信されるようになります。
デフォルトは0です 返り値: 正常に実行されるとTRUE
基本となるクッキーの名前と値
<?php
setcookie("visited", 1);
?>
サンプルプログラム
<?php
$flag = setcookie("visited", 1);
?>
<html>
<head><title>PHP TEST</title></head>
<body>
<?php
if ($flag){ print('<p>クッキーを書き込みました</p>');
}else{ print('<p>クッキーの書き込みに失敗しました</p>');
}
?>
</body>
</html>
これでクライアント側にクッキーを書き込むことが出来ました。次のページで今度はクライアント側に保存されたクッキーの値を読み取ってみます。
(
今日のまとめ研究
1、クッキーは期間を決めて保存できるのに対し、セッションはwebブラウザを閉じるまでという制限。安全性高め
2、変数==箱の中にいろいろパッケージングするもの
3、関数==名前をつけた関数の中にあるものをその名前だけで呼び出す。
function paopao{
いろいろなこと
}
paopao
ブラウザでの表示
いろいろなことがおこってる。
4、パラメーター
function check_true($args){
if($args){
echo $args . 'は真です。';
}else{
echo $args . 'は偽です。';
}
}
check_true(1);
$args を後で1にしてくれる。
5、rand(『最小の数字』,『最大の数字』);
6.,pay.jpはBASEのやつ
7、まなぶくんが漁師になってた。
8、まなぶくんじゅくで紙食ってたのなつかしい。
9、XMLようわからん。
10、データベースもっと勉強しよっと