■ 目次
■ はじめに
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";
}
没有评论:
发表评论