■ 目次
■ はじめに
PHP について説明します。本書は、C、C++、Perl、Java、JavaScript のいずれかを習得している方を対象に、余分な説明を省いています。
■ インストール
http://www.php.net/ → [downloads]→[Windows Binaries]→[PHP 5.2.6 zip package] をダウンロードし、解凍し、好きなフォルダに置いてください。
■ 基本構文
PHPは通常、Webサーバー経由で呼び出しますが、コマンドラインからも実行可能です。
# php test.php
お決まりの Hello World は下記のようになります。
<?php print "Hello World\n"; ?>
<?php ~ ?> の個所はいろいろな書き方がありますが、<?php ~ ?> が一般的です。設定によっては他の形式は使用できないことがあります。<?= ~ ?> や <%= ~ %> は、<?php echo ~ ?> と同じ意味を持ちます。
<?php ~ ?> <? ~ ?> <?= ~ ?> <% ~ %> <%= ~ v> <script language="php"> ~ </script>
■ コメント
コメントは下記の3種類を使用することができます。// と # は 1行コメント、/* ... */ は複数行のコメントを記述できます。
// コメント # コメント /* コメント */
■ 制御構文
言語構造として下記の制御構文をサポートします。
if ($count == 5) { : }
if ($count == 0) { : } elseif ($count == 1) { ←Cの場合は else if、Perlの場合は elsif : } else { : }
switch ($count) { case 1: : break; case $oldcount: ←条件に変数を記述できるところがミソ : break; default: : break; }
while ($count < 10) { : break; ←Perlのlast文に相当 : continue; ←Perlのnext文に相当 : }
for ($i = 0; $i < 10; $i++) { : }
do { : } while ($count < 10);
foreach ($arglist as $arg) { ←配列$argの各要素について : }
foreach ($vallist as $key => $val) { ←連想配列$vallistの各要素について : }
■ 型
PHP は下記の型をサポートしています。
型 | 説明 |
---|---|
論理型(bool、boolean) | TRUE または FALSE を持ちます。 |
整数(int、integer) | -23、0、234 などの整数値を表します。0755 など 0 で始まる数字は8進数と見なされます。0x7fff など 0x で始まる数字は16進数と見なされます。 |
浮動小数点数(float、double、real) | 1.234 などの少数を含む数字を表します。1.2e3 は 1.2×10の3乗、7E-10 は 7×10の-10乗を意味します。 |
文字列(string) | 「文字列」を参照してください。 |
配列(array) | 「配列」を参照してください。 |
オブジェクト(object) | 「クラス」を参照してください。 |
リソース(resource) | オープンしたファイル、データベース接続など特別な値を持つリソース値です。 |
ヌル(NULL) | 値無しを意味します。NULL。 |
■ 文字列
文字列は、ダブルクォート(")またはシングルクォート(')で囲みます。
$msg1 = "This is Japan."; $msg2 = 'That is America.';
"~" の中では改行(\n)などのエスケープシーケンスや、変数を使用できますが、'~' の中では使用できません。
print "My name is $name\n"; ←展開される print 'My name is $name\n'; ←展開されない
変数名と後続の文字の境が無い場合は、変数を {...} で囲みます。
$size = 32; $values = array('size' => 32); class item { var $size; } $item = new item(); $item->size = 32; print "File size is ${size}KB\n"; print "File size is {$size}KB\n"; print "File size is ${values['size']}KB\n"; print "File size is {$values['size']}KB\n"; print "File size is ${item->size}KB\n"; ←これはエラーになる print "File size is {$item->size}KB\n";
"~" の文字列の中では下記のエスケープシーケンスを用いることができます。
改行(\n) キャリッジリターン(\r) タブ(\t) 垂直タブ(\v) フォームフィード(\f) バックスラッシュ(\\) ドル記号(\$) ダブルクォート(\") 8進数文字コード(\77) 16進数文字コード(\x1e)
"~" の中では ' を、'~' の中では " を使用することができます。
print "My name is '$name'\n"; print 'My name is "Tanaka"';
文字列を連結するには . を用います。
print "File size is " . $size . "KB\n";
文字列を比較するには、== ではなく、=== や strcmp() を使用します。== でも一見比較できているように見えますが、"3" と "3.0" が同じ文字列と見なされてしまいます。=== は型も含めた厳密な比較を行いますが、"3" と 3 が同じと見なされないなどの問題があります。
× if ($msg1 == $msg2) { ... } △ if ($msg1 === $msg2) { ... } ○ if (strcmp($msg1, $msg2) == 0) { ... }
下記のように複数行からなる文字列を定義することができます。これをヒアドキュメントと呼びます。EOT や EOT; の前後には空白を入れないようにしましょう。
$msg = <<<EOT This is a pen. EOT;
■ 配列
配列は次のように定義、参照します。
$item = array("Yamada", "Tanaka", "Suzuki"); print $item[0] . "\n"; print $item[1] . "\n"; print $item[2] . "\n";
配列キーとして文字列も利用できます。
$item = array( "name" => "Yamada", "age" => 32, "country" => "Japan", ); print $item['name'] . "\n"; print $item['age'] . "\n"; print $item['country'] . "\n";
二重配列を定義することも可能です。
$item = array( array("name" => "Yamada", "age" => 32), array("name" => "Tanaka", "age" => 26), array("name" => "Suzuki", "age" => 43), ); print $item[1]['name'] . "\n"; print $item[1]['age'] . "\n";
■ クラス
未稿。
■ 関数
関数は下記のように定義します。
function add($x, $y) { return $x + $y; }
引数を省略した場合のデフォルト値を指定することができます。
function conv($msg, $code = "UTF-8") { : }
引数の参照渡しにより、呼び出し元の変数を書き換えることが可能です。
function add($x, $y, &$ans) { $ans = $x + $y; }
■ 入出力
◆ 文字列を表示する(print、echo)
文字列を表示します。print は関数として定義され、戻り値があり、文字列をひとつしか指定できませんが、echo は言語構造(言語仕様のひとつ)として定義され、戻り値は無く、カンマを用いて文字列を複数指定できます。速度は echo の方が若干だけ早いようです。
print "ABC\n"; echo "ABC\n";
◆ フォーマット付き文字列を表示する(printf)
printf() は文字列をフォーマットに従って表示します。
$tm = localtime(time(), 1); printf("%04d/%02d/%02d %02d:%02d:%02d", $tm["tm_year"] + 1900, $tm["tm_mon"] + 1, $tm["tm_mday"], $tm["tm_hour"], $tm["tm_min"], $tm["tm_sec"]);
◆ ファイルを読み込む(fopen、fread、fwrite、fclose、filesize)
$f = fopen("data.txt", "r"); $buf = fread($f, filesize($file)); fclose($f);
◆ ファイルを読み込む(file)
foreach (lines("data.txt") as $line) { print $line; }
■ HTTP
◆ HTTPサーバーから読み込む(fopen)
fopen()をHTTPサーバーに対して行うことも可能です。
$fp = fopen("http://www.yahoo.co.jp/", "r"); while ($line = fgets($fp)) { print $line; } fclose($fp);
◆ HTTPサーバーから読み込む(CURL)
CURLを用いてHTTPリクエストを発行する例です。
$ch = curl_init("http://www.yahoo.co.jp/"); curl_exec($ch); curl_close($ch);
◆ HTTPサーバーから読み込む(CURL)
CURLを用いてプロキシ経由でPOSTリクエストを発行する例です。
$ch = curl_init("http://www.yahoo.co.jp/"); curl_setopt($ch, CURLOPT_PROXY, "proxy.example.com"); curl_setopt($ch, CURLOPT_PROXYPORT, 8080); curl_setopt($ch, CURLOPT_POST, TRUE); curl_setopt($ch, CURLOPT_POSTFIELDS, "param1=value1"); curl_exec($ch); curl_close($ch);
◆ HTTPサーバーから読み込む(PEAR)
PEARを用いてHTTPリクエストを発行する例です。
require_once 'HTTP/Request.php'; $req =& new HTTP_Request("http://www.yahoo.co.jp/"); $req->sendRequest(); print $req->getResponseBody();
■ データベース
◆ MySQLサーバからデータを読み出して表示する(mysql_xxx)
if (!$link = mysql_connect("localhost")) { die("mysql_connect(ERROR)"); } if (!mysql_select_db("test")) { die("mysql_select_db(ERROR)"); } if (!$result = mysql_query("SELECT * FROM meibo")) { die("mysql_query(ERROR)"); } while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) { foreach ($line as $col) { print "$col,"; } print "\n"; } mysql_close($link);
◆ PEAR::DBを用いてデータベースを読み出す(PEAR::DB)
require "DB.php"; $db = DB::connect("mysql://$user:$passwd@$host/$dbname"); if (PEAR::isError($db)) { die($db->getMessage() . "\n"); } $stmt = $db->prepare("SELECT uid, name FROM users WHERE uid = ?;"); if (PEAR::isError($stmt)) { die($stmt->getMessage() . "\n"); } $rs = $db->execute($stmt, array($uid)); if (PEAR::isError($rs)) { die($stmt->getMessage() . "\n"); } while ($row = $rs->fetchRow()) { print "$row[0] : $row[1]\n"; } $db->disconnect();
◆ PDOを用いてデータベースを読み出す(PDO)
try { $db = new PDO("mysql:host=$host;dbname=$dbname", $user, $passwd); } catch (PDOException $e) { $err = $e->getMessage(); die("ERROR: $err"); } $stmt = $db->prepare("SELECT uid, name FROM users WHERE uid = :uid;"); if ($stmt == FALSE) { die("ERROR: prepare()\n"); } if (!$stmt->bindParam(":uid", $uid)) { ←変数で渡す必要がある die("ERROR: bindParam()\n"); } if (!$stmt->execute()) { die("ERROR: execute()\n"); } while ($row = $stmt->fetch()) { print "$row[0] : $row[1]\n"; }
没有评论:
发表评论