Facebookアプリのテストで、サーバーサイドでPHPを使用。
(クライアント側では出来ない処理、サーバー側でやった方がスマートな処理が多い)
4年前に少しやったので、復習から。
目処はログイン・パーミッション、form経由でデータ受け取って
(クライアント側はhtml+Javascript)
それに応じた処理→結果表示、ウォール投稿位まで。
また、JavaScriptでFacebookの顔アイコンを読み込んでcanvasに表示しても、
それを合成(診断結果画像として生成)後にPOSTするとsecurity errorが
出るが、サーバー側でやれば(同ドメインなので)大丈夫そう。
復習用として「PHPの絵本(アンク)」を使用。

テスト環境はXAMPP、入力はEmEditor。必要ならPHP用のIDEも探す。
●PHPを始める前に
・クライアント→サーバー送信
GET、OSの環境変数に保存、文字数制限有、アドレスバーに表示、パラメーター直接指定可。
POST、標準入力(キーボード入力と同じ)で受け取る、文字数制限無し、
アドレスバーに非表示、パラメーター直接指定不可。
・HTMLに埋め込むタイプのスクリプトをサーバーサイドスクリプトと言う。
(他にJSP、ASP他、特徴としてCGIより負担が少ない)
・文字コードの設定はc:¥xampp¥php¥php.iniファイルのmbstringで行う。
※本はEUC-JPだけど、UTF-8を使用(BOM無しにしないと化ける)。
●●1章 基本的なプログラム
・Hello!World表示OK。echoでなくprint使用。
・HTMLのタグはOKなので省略。
・htmlのformから送られたデータはスーパーグローバル変数の(1つ)$_POSTで受け取る。
(サンプルでテキストボックス入力→受け取って表示OK)
●●2章 変数と配列
・型指定無し。宣言無し。
・数値型、論理型、文字列、配列、連想配列、スーパーグローバル変数等。
・配列のインデックス(キー)は添字(そえじ)とも言う。
・書き方
$a = 2;
変数の中身を出力(trace)するのは、var_dump()関数。
$a = 100;
$b = 2.2;
$c = true;
$d = NULL;
$e = "PHPの絵本";
var_dump($a);//int(100)
var_dump($b);//float(2.2)
var_dump($c);//bool(true)
var_dump($d);//NULL
var_dump($e);//string(12) "PHPの絵本"
文字として$を使いたい時は¥でエスケープ。
print "¥$a = $a";//$a = 100
型
・int:整数(integer、インテジャー)、小数点以下無し、-2,147,483,645〜2,147,483,645
・float:浮動小数点(float叉はdouble)、およそ-1.8*10^308〜1.8*10~308
・bool:論理型(boolean)、真偽、true/false
・NULL:NULL型、値を持たない(undefinedは無し?)
文字列1(string)
””の中に変数を書くとその値に変換、’’の中では文字列として扱われる。
エスケープシーケンス…¥(エスケープ文字を付けたもの)、
¥n(改行)、¥¥(¥表示)、¥"(”表示)、¥'('表示)¥xNN(16進数表記の1文字)等。
’’内で使えるのは¥'と¥¥のみ。
ヒアドキュメント…長い文字列を簡潔に表示出来る。<<<で開始、ラベルで挟む。
<?php
$a = <<< EOD
Hello
World!<br>¥n
EOD;
print "$a";
?>
[]で文字列の中(※この場合配列の中では無い)にアクセス
$str = 'cat';
$first = $str[0];
$third = $str[2];
print "$first¥n";//c
print "$third";//t
型変換
型は変数に代入で自動的に決まる。
$a = '1';//string
$a = 1;//int
型キャスト(型変換)
型名を()で囲ったものを変数の前に置く
$a = 1;
print "$a";//1
$a = $a + 0.5;
print "$a";//1.5
$b = (int)$a;//整数にcast
print "$b";//1
strval(ストリングバリュー)()関数でスカラー型(論理型or数値型or文字列)の
変数を文字列に変換出来る。
//■strval
$a = true;//string
$b = 1234;//int
$str1 = strval($a);//文字列に変換
$str2 = strval($b);//文字列に変換
print "$str1";//1
print "$str2";//1234
配列array();
添え字を使って値と関連づけて設定可。
$a = array(0=>1, 1=>2, 2=>3);
異なった配列を1つにまとめてOK。
$a =array('ねこ', 100);//string int
配列の参照。代入
$a = array(1,2,3);
print $a[0];//1
print "<br>";
$a[0] = "One";
$a[1] = "Two";
$a[2] = "Three";
print $a[0];//One
print"<br>";
print $a[1];//Two
print"<br>";
print $a[2];//Three
print"<br>";
連想配列(添え字に文字列)
$a = array('dog'=>'いぬ', 'cat'=>'ねこ');
print $a['dog'];//いぬ
print "<br>";
print $a['cat'];//ねこ
配列の利用
配列の破棄(unset()関数を使う)、配列名指定で全体or個別要素指定
//■配列の破棄
$a = array("a","b","c");
print $a[1];//b
print "<br>";
unset($a[1]);
print $a[1];//Notice: Undefined offset:〜
print "<br>";
配列の差を取得する。
ある配列にあって、他の配列に無い要素を取り出すには、array_diff()関数を使う。
$a = array(1,2,3);
$b = array(1,3,4);
$c = array_diff($a, $b);//配列aに有って、bには無い(aの要素)
//print $c[0];//Undefined offset: 0
print $c[1];//2…a[1]<赤>添え字は保持される。
print "<br>";
配列の要素を追加する。
array_push()関数を使う。
//■配列の要素を追加する
$a = array(1,2,3);
array_push($a, 4, 5);//配列aの末尾に4と5を追加。
//添字0,1,2,3,4、値1,2,3,4,5
$b = array('A'=>1, 'B'=>2, 'C'=>3);
array_push($b, 4, 5);//添え字が文字列に追加の場合は添字0スタート。
//添字A,B,C,0,1、値1,2,3,4,5
リファレンス(参照)
変数のリファレンスを作ると、元の変数とリファレンスは同等のものとして扱われる。
(参照渡しと値渡し)
$a = 1;
$b = $a;
$a = 3;
print "¥$aの値は $a, ¥$bの値は $b<br>¥n";//$aの値は 3, $bの値は 1
$b = &$a;//リファレンス
$a = 5;
print "¥$aの値は $a, ¥$bの値は $b<br>¥n";//$aの値は 5, $bの値は 5
$b = 100;
print "¥$aの値は $a, ¥$bの値は $b<br>¥n";//$aの値は 100, $bの値は 100
//(双方向で影響受ける)
定数、defineで設定、一度値を設定すると変更不可。
define("DEF_COLOR", "Blue");//定数名、定数値
定義済み定数
__LINE__
__FILE__
__FUNCTION__
__CLASS__
__METHOD__
=>は代入、->はオブジェクト(クラス)のメソッドやフィールド変数を
参照するための演算子。
//■定数
$line = __LINE__;
print "$line<br>¥n";//112
定義済みの定数
・スーパーグローバル変数
自動的に定義され、プログラムのどこからでも参照可。
スーパーグローバル変数は連想配列なので、キー:値で取得。
$GLOBALS
$_SERVER
$_GET
$_POST
$_COOKIE
$_FILES
$_ENV
$_REQUEST
$_SESSION
print "サーバーのドメイン名は¥"".$_SERVER['HTTP_HOST']."¥"です。<br>¥n";
//サーバーのドメイン名は"localhost"です。
環境変数
OSが持っているOSの環境情報。
$_ENVと$_SERVERで参照出来る。
$_SERVER['HTTP_REFERER'];//直前のURL
$_SERVER['HTTP_USER_AGENT'];//ブラウザ情報他
phpinfo()関数を利用すると、実行しているサーバー環境の変数を参照出来る。
●●3章 演算子
算術演算子、+、-、*、/、%
代入演算子、=
複合演算子、+=、-=、*=、/=、%=
インクリメント演算子、++
デクリメント演算子、--
前置(++$a)は変数の参照より先に、
$b = $a = 1;
$b = ++$a;
print "$b<br>¥n";//2
後置($a++)は変数の参照より後に演算が行われる
$b = $a = 1;
$b = $a++;
print "$b<br>¥n";//1
文字列のインクリメント(半角のみ、デクリメントは無し)
$b = "A";
$b = ++$b;
print "$b<br>¥n";//B
※"z"→"aa"
比較演算子、==、===(型も同じ)、<、>、<=、>=、!=、<>、!==
(値が等しくない叉は型が異なるのどちらか叉は両方)
式自体を条件式に使用可。
$a = 10;
$b = 20;
print '$a < $b:'+ ($a < $b);//0
print '$a > $b:'+print ($a > $b);//1
配列演算子
・配列の結合、+で結合、左側の配列に右側の配列の要素を追加、
但し同じ添字の要素は上書きされない。
//配列の結合
$d = array(1, 2);
$e = array(3, 4, 5);
$f = $d + $e;
print "$f<br>¥n";//Array
print "$f[0]<br>¥n";//1
print "$f[1]<br>¥n";//2
print "$f[2]<br>¥n";//5
・配列の演算、
==、同等、「要素ペア」が等しい
===、同一、「要素ペア」と「型」と「並び順」が等しい
!=、等しくない、
<>、等しくない
!==、同一でない
※1と"1"では値(要素)は等しいとみなされる。型は違う。
・その他の演算子
論理演算子
&&(かつ)、||(または)、!(否定=〜ではない)。
and(かつ)。or(または)。not(否定=〜ではない)。
複雑な条件式
(50 <= $a) && ($a < 100);//$aは50以上100未満
条件付き実行
条件式 ||(or)処理 … 条件式がtrueなら処理を行わずfalseなら行う。
条件式 &&(and)処理 … 条件式がtrueなら処理を行い、falseなら行わない。
$a = 4;
($a < 10) || (print "¥$aは10以上¥n");
($a < 10) && (print "¥$aは10未満¥n");//$aは10未満
三項演算子
(条件式)? true時処理 : false時処理
$b = 1;
$a = ($b < 15) ? 10 : 20;
print "$a<br>¥n";//10
エラー制御演算子
@を関数の前に付けると、エラーや警告を無視する(何も表示しない)。
文字列演算子
.を使うと、文字列を連結出来る。
$str = 'Hello' . " " . "World";
print "$str<br>¥n";//Hello World
実行演算子
`バッククォート(SHIFT+@)で文字列を挟むと、シェルコマンド(OSが持つ命令)や
外部プログラムを実行し、その表示結果を出す。
$output = `time/T`;
print "$output";//15:13
print "<pre>".$output."</pre>";//15:13
演算の優先度
本参照。
数学関数
abs、ceil、floor、round他。必要に応じて参照。
複雑な論理演算
うるう年の算出例。
■4章 制御文
if、if〜else、if〜elseif〜else、if文のネスト。
for、ループ、二重ループ。
foreach文は配列の要素の数だけ繰り返す。
$season = array('spr'=>'春', 'sum'=>'夏', 'aut'=>'秋', 'win'=>'冬');
foreach($season as $key => $a){
print "$key は $a<br>¥n";
}
//配列の要素をキー:値で取り出し
//spr は 春
//sum は 夏
//aut は 秋
//win は 冬
while…ある条件が成り立っている(真の)間繰り返し。
※forとの違いは、カウンタが無い、主に繰り返し回数が不明なものに実行。
do〜while…ある条件が成り立っている(真の)間繰り返し(条件を下に置く)
ので、最低一回は実行。
$s = $i= 0;
do{
++$i;
$s += $i;
print "$i";
print "の時、";
print "$s<br>";
}while($i < 10);
print "1から";
print "$i";
print "までの和は$s";
//1の時、1
//2の時、3
//3の時、6
//4の時、10
//5の時、15
//6の時、21
//7の時、28
//8の時、36
//9の時、45
//10の時、55
//1から10までの和は55
※whileは無限ループになりやすいので注意。
break…中断し一番近いブロックの終わりへ飛ぶ。
continue…中断し一番近いループの始まりに飛ぶ。
switch文
switch〜case〜default。
□サンプルプログラム
自動販売機にお金を投入(htmlのフォームで金額入力)。分かり易い。
↓
php側で受け取り、判別処理→結果表示。
※while文でお釣りを硬貨の種類毎に分けて枚数表示する方法(考え方)。
例:1000円投入→送信→結果
>ありがとうございました。お釣りは880円です。
>
>硬貨の枚数は次の通りです。
>500円玉1枚
>100円玉3枚
>50円玉1枚
>10円玉3枚
breakとcontinueの階層指定
break 2;
continue 3;
で階層をまたぐ事が可能。
参考:
■PHPの絵本(株)アンク著
http://www.amazon.co.jp/dp/479811264X
>復習用として読むと分かり易いと思います
>他言語を使用していた方には理解できる本だと思います
■PHPの絵本 正誤表:SEShop.com
http://www.seshop.com/book/errata/7671/list
※サンプルCDやダウンロードは無し。
■PHP: PHP マニュアル - Manual
http://php.net/manual/ja/index.php
■PHPの日本語設定|PHP入門以前
http://www26.tok2.com/home/phpbeginner/japanease_php.html
>「php.ini」をテキストエディタで開き、編集を行います。
■PHPの文字化けを本気で解決する - ぎじゅっやさん
http://hain.jp/index.php/tech-j/2007/02/13/%EF%BC%B0%EF%BC%A8%EF%BC%B0%E3%81%AE%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91
■PHP: スーパーグローバル - Manual
http://php.net/manual/ja/language.variables.superglobals.php
>これは、スクリプト全体を通してすべてのスコープで使用可能な変数のことです。
>関数やメソッドの内部からアクセスする際にも global $variable;
>などとする必要はありません。
※$_SERVER、$_POST、$_COOKIE、$_SESSION他
■「=>」「->」の意味 - PHPプロ!Q&A掲示板
http://www.phppro.jp/qa/536
>ソース中の「=>」「->」はどのような役割を果たしているのでしょうか?