PHP入門

トップ > PHP入門

目次

はじめに

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";
}

リンク


Copyright (C) 2008 杜甫々
初版:2008年10月21日、最終更新:2008年10月21日
http://www.tohoho-web.com/wwwphp.htm