404 motivation not found | t_ishidaのブログ

12月/07

29

PHP入門(初級編)

<<能書き>>

自分でPHPを扱うことになって、ある程度覚えたので整理する為に記事にしてみます。内容の正誤の保障しません。ここに書いてあることを鵜呑みにして何があっても知りません。ただし、突込みは大歓迎。

修正履歴

  • 算術演算子の欄に「*」が無かったのを追加
  • 配列、連想配列の欄を修正

<<対象読者>>

  • オレ
  • これを読んで意味が分かる人

<<狙い>>

  • PHPを実行できる
  • PHPで最低限の事が出来るようになる

<<Summary>>

  • PHPの概要?
  • 環境
  • 入力と出力
  • 変数とリテラル
  • 演算子
  • 制御構文
  • 関数

<<PHPの概要>>

PHPとは

プログラムです。

スクリプトを解釈するバイナリファイルであり、かつ、その周辺の環境、及び、そのスクリプト自身の言語名をさします。

特徴
  • Webアプリ作成用に最適化されている。
    • html文中に埋め込んで動作させられる
    • セッションがはじめから用意されている。
    • POST,GETのパラメータがはじめから、パースされている。
  • やたらめったら、なんでもかんでも関数が実装されている
  • ドキュメントが割りと充実している。
    • ゆえに調べれば、大概の事が実現できる。
  • 多くのPerlerからは存在意義を疑問視されている
  • Perl互換と言いながら、互換じゃないっぽい正規表現
    • 正規表現はJScriptの方が、多分Perlには近いっていうか、JScriptで悩んだ事は無い
  • ロジックをHTMLに埋め込むタイプの言語なのに、なぜかテンプレートエンジンが有る。

とは言え、Webアプリを手軽に作るのには多分、良い選択肢だと思う。

良いところ
  • なんも考えなくても、Webアプリの開発環境を作れる
  • 割となんでも出来る
  • mod_phpは、mod_perlより手軽だと思う。
悪いところ
  • Session変数の実態とか、POST,GETのパラメータの実態とか、そもそもWebサーバーって何?を知らないWebプログラマ(笑)が量産されているのは、PHPのせいだと思う。
    • でも、さらに掘り下げると、CGI.pmや、各種フレームワークの類も、それに一役買っている気がしなくも無い。
  • Perlを先に扱っていると、ちょっと気持ち悪い
  • 追加のdllとか、iniとか、そういうところでハマりやすい。

<<環境>>

インストール

圧倒的多数派のWindowsの人向けに説明します。

何も考えずにxamppをインストールしましょう。

http://www.apachefriends.org/jp/xampp-windows.html

インストーラの指示に従ってインストールして下さい。

インストールする場所を変えていなければ、

“C:/Program Files/xampp/htdocs”と言う場所を覚えておきましょう。

インストールする場所を変えた(愚か者|Apacheの分かる貴方)は、

“htdocs”の場所を、httpd.confを参照して探しておきましょう。

プログラムの実行
  1. 以下のソースをテキストエディタに貼り付けます。
    1. テキストエディタって何?って言う人は、メモ帳でOK
  2. a.phpと名前を付けて保存します。
  3. “C:/Program Files/xampp/htdocs”にa.phpをコピーします。
  4. ブラウザを立ち上げてアドレスバーに”http://localhost/a.php“にアクセスします。

a.php

<html>
<body>
<?php
for($i = 0;$i < 100;$i++) echo("fuckin' PHP<br />");
?>
</body>
</html>

なんか不謹慎な言葉でブラウザが一杯になりましたか?

プログラムの修正

では、さらにプログラムを修正してみましょう。

  1. “C:/Program Files/xampp/htdocs/a.php”をメモ帳で開きます。
  2. “fuckin’ PHP”を”Hello,PHP!!”に修正します。
  3. ブラウザを再読み込みします。

ブラウザが、しつこくPHPに挨拶してますか?

おまけ

“C:/Program Files/xampp/php”の中に有るphp.exeをコマンドからたたけば、コマンドから、プログラムを実行出来ます。

以下のような感じです。

cd "C:/Program Files/xampp/php"
php "C:/Program Files/xampp/htdocs/a.php"

ここで書く内容はブラウザからだろうと、コマンドからだろうと、どちらから実行しても変わらない内容ばかりだと思うので、好きな方を選んでいただいて結構です。もし、コマンドから実行する人は、「”C:/Program Files/xampp/php”」を「マイコンピュータのプロパティ=>詳細設定=>環境変数=>”PATH”」に”C:/Program Files/xampp/php”を追加しておくと良いかも知れません。ただし、「環境変数」が何か分からない人は、いじっちゃ駄目。

注意点

  • ブラウザから実行する場合に読み込まれるiniファイルは、apacheに実行ファイルと一緒のディレクトリに居るphp.ini
  • コマンドから実行される場合に読み込まれるiniファイルは、”C:/Program Files/xampp/php”のphp.ini

<<入力と出力>>

コンピュータの出来る事は酷く大雑把に3つ

  • 入力
  • 演算
  • 出力

です。

これはスコープを広げてコンピュータそのもので見れば

  • キーボードから入力
  • なんか計算する
  • 画面に出力(表示)

スコープを狭めて、プログラムの実行にしてみれば

  • プログラムにコマンドライン引数で入力
  • プログラム内部で演算
  • ログなり、標準出力なりに出力

ほらね?

で、ここでは入力と出力の話をすることにしましょう。

PHPは主にWebで扱うので、Webでの入出力としてCGIの仕組みを説明しますね。

でも色々端折る必要が有るんだよな・・・

CGIとは、Common Gateway Interfaceの略。Webでプログラムを実行する仕組みの事を言います。勿論、PHPもCGIを利用してWebプログラミングをします。

えっと、通常はWebサーバーって何をしているかって言うと・・・。

Webサーバーの普通の仕事
  1. コマンドの入力を待ってる
  2. こう言うコマンド”GET index.html”を渡される。
  3. index.htmlを読む
  4. index.htmlに記述されている内容を呼び出し元に返す

っていうだけね。基本はね。

で、”.cgi”と言う拡張子はCGIプログラムだよ~っていう設定をしておくと

WebサーバーのCGIの仕事
  1. コマンドの入力を待ってる
  2. こう言うコマンド”GET index.cgi?a=b&b=c”がWebサーバーに渡される。
  3. “index.cgi?a=b&b=c”の?以降を、環境変数”QUERY_STRING”に保存する。
  4. index.cgiはCGIなので、このファイルをプログラムとして実行する。
  5. そのCGIがprintした内容を呼び出し元に返す。

ちなみに、GETコマンドの受け渡しや、戻ってきた文字列の解析はブラウザが勝手にやってくれてるので、普段は意識する事は有りませんね。またGETとPOSTの違いは今回は割愛します。今回はGETだけ。

一応、CGIってそういうものと言う事を意識しておいて下さい。

GETコマンドとQUERY_STRING

Webサーバーへ渡すコマンドに”GETコマンド”というのが有ります。一応、どういう事をするのか?と言うのは、上のWebサーバーの仕事を見れば分かると思いますので割愛です。QUERY_STRINGと言うのは、”GET index.cgi?a=b&b=c”の、”?”以降の部分です。これはCGIプログラムで扱うパラメータで、”key=value”の組み合わせの文字列を、”&”で繋いで渡してきます。CGIではこれを解析して扱います。

PHPの入力

CGIの説明で、QUERY_STRINGと言う環境変数がどうのって話したけど、PHPではそれを意識しません。勝手に解析して「$_GET,$_POST」と言う変数に入れておいてくれます。

//もし、index.php?a=1&b=2と仮定すると
$key1 = 'a';
$key2 = 'b';
$value1 = $_GET[$key1];   //QUERY_STRING
$value2 = $_GET[$key2];   //QUERY_STRING

print( $key1 . "=".  $value1 . "\n");  //a=1と表示されます
print( $key2 . "=".  $value2 . "\n");  //b=2と表示されます

PHPの出力

print関数またはecho関数でやります。両者共に文字を標準出力に書き出すと言う目的の元では違いは有りません。それと普通の人は生涯その違いを意識する必要無いと思います。えっと、標準出力って何?って話ですね。標準出力と言うのは、誤解を恐れずに言えば、コマンドプロンプトの画面です。(をい)で、CGIではアレを横取りして呼び出し元に返すのです。

print('Hello,World!!')
echo('Hello,World!!')

<<プログラムの記述の仕方>>

1 <?php
2    //program
3    $a = 1; $b = 1; $c = 1;
4    $d = 1;
5    func( $a , $b , $c);
6 ?>
  • 1,6行目に注目
    • 「<?php」から「?>」の間にプログラムを記述します。
  • 3行目に注目
    • 一つの命令の区切りは、「;」セミコロン。
  • 5行目に注目
    • 関数の呼び出しは、”関数名” + “(” + “引数” + “)”
    • 引数は、「,」カンマ区切りで個数分渡す。

<<変数とリテラル(データ)>>

要約

プログラムとは大雑把に説明すると、”データをアルゴリズムによって処理するもの”です。その「データ」が変数やリテラルになります。数学の授業で足し算を一般化すると「”x + y”」になるよ。って言うような話があったと思います。これがまさにプログラムです。

この場合、

  • “x + y”がアルゴリズム
  • “x”,”y”がデータ

です。

何も考えずに以下を眺めてください。

function plus( $x, $y ){ return $x + $y; }

“return $x + $y”

これが上の一般化の話で出てきた、”x + y”ですね。この部分がアルゴリズムです。そして「$x,$y」がデータです。プログラムの実行とは一般化した式を記述していき具体的な値を与えて計算させることなんですね。

//$x に 0を与えて、$y に 1を与える。
//すると $x + $yは、0 + 1として処理される。
print( plus( 0, 1 ) );  //1

print( plus( 1, 2 ) ); //3
print( plus( 2, 3 ) ); //5
print( plus( 3, 4 ) ); //7

あ、printとかechoとかは、画面に文字を出力するための関数です。

変数

二つ上のプログラムで言うと、$x,$yが変数です

つまり一般化する為の代替文字です。

リテラル

一つ上のプログラムで言うと0とか1とか具体的な値が出てきてますね。

一般化の中の具体的な値をリテラルと言います。

数値のリテラル表現

数値を表現する時には「裸」で書きます。

$foo = 1;

文字列のリテラル表現

文字列を表現する時には、引用符で囲みます。

$bar = 'a';

便利な文字列リテラル表現「”」が有りますが、

ややこしくなるので、とりあえずは置いておきます。

そもそもプログラムとは?

コンピュータと言うのは沢山ある電球の塊だと思ってくださいコンピュータは、その電球を付けたり、消したりしてるだけの代物です。で、「電球が付いていたら”1″だよ。電球が消えていたら、”0″だよ。」っていう感じです。

こんな感じ。

全部消えた電球 = 0

00000000

一個だけ付いた電球 = 1

00000001

プログラミング言語で言うところの変数とは「”こっから、ここまでの電球は数値って事にするね。で、あそこから、あそこまでに電球が文字ね。”」みたいな感じです。で、「あそこから、あそこまで」に扱い易いように名前を付けたのが変数です。

例えば、こう言う電球があったとしてと、

000000000000000

変数を宣言すると、こんな感じで電球を分け合います。

こっち側は$foo      |   こっち側は$bar
|
00000000 | 00000000
↑
ここで区切った

で、実際に値を代入すると。
$foo = 1;
$bar = "a";

$foo = 1;           |   $bar = "a";
|
00000001 | 00110001
↑
ここで区切った

"a"は数値としては97です。
それを文字として表現するっていう約束の元に動作させると
"a"って言う風に画面に表示されるだけです。
その約束を表現するための電球がどっかに有る訳ですね。
そういうのの積み重ねでプログラムは動作します。

そうすると、見えてくるのは。

  • 変数名を記憶するための電球
  • 変数の型を記憶するための電球
  • 変数がどこから電球を確保しているか?
  • 何個の電球を確保しているのか?

を記憶するための電球が必要になる訳です。

うん、こう言う風に書いて全部を説明していると、多分、心が折れて途中でやめたくなるのでこの先は要点だけにします。ifのところでは、この電球にジャンプするんだよ。とかforはジャンプして戻ってくるんだよとか、そういう話を全部しようと思ってたけど、大体、PHPそのものとは直接関係ないし。そもそもPHPを学ぼうと言う人は、こういうのを気にしたくない人のはずだしね。

宣言

“$” + “名前”(ex:”$foo”)で宣言します。値の代入は”=”で行います。”$foo”に、”1″を代入したい場合には、”$foo = 1;”と書きます。他の言語を使っている人のために補足しておくと。”declare $foo”とか”int $foo”とか書く必要は有りません。”$foo = 1;”と、値を代入した瞬間から変数が確保された事になります。

データ型

変数やリテラルには以下のような型があります。

  • 数値型
    • 数値計算するための型
  • 文字列
    • 文字列を扱うための型
  • オブジェクト
    • classのインスタンス
    • classとは変数と関数ポインタの構造体のこと。
    • 今は気にしなくてOK
変数の種類

PHPの変数には主に3種類の形が有ります。

例えば名前を一個を扱うのか?、名前の集合を扱うのか?で違います。

自分の名前を表示したい場合(単数形)。

$my_name = 't_ishida';
print($name);

友達の名前を表示したい場合(複数形)

$friend_names[0] = 'larry';
$friend_names[1] = 'richard';
$friend_names[2] = 'gates';

print($friend_names[0]);
print($friend_names[1]);
print($friend_names[2]);

友達の様々なデータを扱いたい場合(連想配列)

$larry[name] = 'larry';
$larry[job]  = 'hacker';

print($larry[name]);
print($larry[job]);
箇条書きで整理
  • 単数形
    • $foo = 1;
    • print($foo);
    • $fooとだけ書くと、単数形の変数です。
$foo = "bar";
echo($foo);
  • 複数形
    • $foo[0] = 1;
    • print($foo[0]);
    • $fooの後に”[" + 数値 + "]“とすると、同じ名前の変数で複数の値を表現できます。
//普通に書くとこう
$foo[0] = "bar";
$foo[1] = "baz";

//こう言う書き方も出来る
$foo = array(
"bar" ,
"baz"
);

//ひたすら追加する時にはこういう風にも書ける
$foo[] = "bar";
$foo[] = "baz";
  • 連想配列
    • $foo[bar] = 1
    • print($foo[bar]);
    • $fooの後に”[" + 文字 + "]“とすると、同じ名前の変数にさらに文字で名前を付けて複数の値を表現できます。
$foo[bar] = "baz";

$foo = array(
'bar'   => 'baz' ,
'xyz'   => 'zyx'
);

<<演算子>>

演算子とは

演算子とは、いろいろするための記号です。

算術演算子(計算するための演算子)
演算子 内容
+ 右側の値と左側の値を加算します print( 1 + 1 ); //2
- 右側の値から左側の値を減算します print( 1 – 1 ); //0
* 右側の値と左側の値を乗算します print( 1 * 1 ); //1
/ 右側の値から左側の値を除算します print( 4 / 2 ); //2
% 右側の値から左側の値を除算した余りを算出します print( 5 % 2); //1

比較演算子
演算子 内容
== 値が一致するかを比較します if( 1 == 0 )
< 左側の値より、右側の値の方が大きいか?を比較します if( 1 < 2 )
> 左側の値より、右側の値の方が小さいか?を比較します if( 1 > 2 )
<= 左側の値が右側の値以下か?を比較します if( 1 <= 2 )
>= 左側の値が右側の値以上か?を比較します if( 1 >= 2 )

===とか有るけど、とりあえずは必要ないので、無視して欲しい。

文字列結合演算子

プログラムで文字列同士を、くっつける場合に使います。

使う演算子は「.」です。

具体的には以下のような場合

$a = '好き';
print( '私はプログラムが' . $a . 'かも知れません'。 );

$aは明示的に代入していますが、変わる可能性が有るものだと思ってください。

その場合、一続きのリテラルでは書けないので文字列同士を結合して実現します。

そのような場合に、文字列結合を使います。

エスケープシーケンス

いろいろ有りますが、とりあえずは改行だけ覚えておけば良いでしょう。

「\n」です。

それから、メタ文字を生かすためには、引用符を「”」で記述する必要が有ります。

print("1\n");
print("2\n");

エスケープシーケンスじゃないよ~としたい場合には、”\\”のようにします。

print(&#34;&#92;&#92;n&#34;);
[/pre]

<p>また、引用符中に、引用符を使いたい場合には、「\"」とします。</p>
<p>具体的には以下のようにします。</p>
[php]
print(&#34;&#92;&#34;foobarbaz&#92;&#34;&#34;);
print(&#39;&#92;&#39;xyzzy&#92;&#39;&#39;);

<<制御構文>>

if

ifと言うのは、そのまんまです。もし~だったら?と言う場合に使います。

$name = 't_ishida';
if( $name == 't_ishida' ) {
echo('foo');
} else {
echo('bar');
}
  • ifの後に、”(” + 条件 + “)”を記述します。
  • 条件の直後の”{” から “}”までが、条件と一致した時に実行される処理
  • “else”の後の”{”から”}”までが、条件と一致しなかった場合に実行される処理
for

forと言うのはループです。~である間は繰り返し実行しろと言う場合に使います。

for ($i = 0; $i < 100; $i = $i + 1 ) {
echo("$i <br />\n");
}
  • forの後に、”(” + ループ開始時に一回だけ実行される処理 + “;” + ループする条件 + “;” + ループ一回毎に実施される処理 + “)”
    • 例の意味の解説
    • ループ開始時に一回だけ実行される処理に「”$i” に “0″を代入する」を指定しています。
    • ループする条件に「”$i”が100より小さい間」を指定しています。
    • ループ一回毎に実施される処理に「”$i”に1を足す」処理を指定しています。
  • 条件の直後の”{” から “}”までに繰り返したい処理を記述します。

以下のプログラムでは、ifとforを組み合わせて、ほんのちょっとだけ複雑な処理をしています。

for( $i = 0; $i < 100; $i++ ){
if ( $i % 3  == 0  && $i % 5 == 0 ) {
//3と5の公約数の時にはfoobar
print("$i : foobar\n");

} elseif ( $i % 3   == 0 ) {
//3の約数は foo
print( "$i : foo\n" );

} elseif ( $i % 5 == 0){

//5の約数は bar
print( "$i : bar\n" );

} else {

//3と5の約数以外は baz
print( "$i : baz\n" );

}
}

<<関数>>

関数とは何度も行う処理を、別個に記述しておくことで、処理を呼び出すだけで実行できるようにしておくものです。「数学で”Σ”は、合計するんだよ。」とかって約束ありますよね?あれと一緒です。

以下のように記述します。

//関数を定義
function plus( $a ,$b ){ return $a + $b; }
function minus( $a ,$b ){
//負の数は嫌だな
if( $a < $b ){
return 0;
}
//効率悪いけどね
for($i = 0; $i < $b; $i++ ){
$a = $a - 1;
}

return $a;
}

$x = 1;
$y = 1;
//出力したり
print( plus( 1, 2 ) );

//変数に代入したり
$z = minus( $x, $y );

//呼び出す時は"関数名"+ "(" +引数 + ")"
//引数が無いときは以下みたいな感じ
function_hasNoParam();
  • “function” + ” ” + 関数名 + “(” + 引数 + “)”
  • “{” から “}”までが、関数の内容
  • 関数の内容で、return + “変数” で、変数を呼び出し元に返します。

<<とりあえず>>

ここまで知ってれば、後はちょっとした知識を補足しながら、

大概のプログラムを書けると思います。

次、やる気が有れば、色々書いてみます。

ってか、Webプログラミングからプログラムを説明するのって難しいね。

多分、書くとしたら、Webサーバーの話、オブジェクト指向の話、PEARの話、DBの話。

あと、今回は端折った様々の補足。

Share and Enjoy:
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Tumblr
  • email
  • Facebook
  • FriendFeed

RSS Feed

コメントはまだありません。

Leave a comment!

<< Webサーバーもどきを作ってみる

MyMiniCity >>

Find it!

Theme Design by devolux.org

Tag Cloud