[ホーム] -> [Aache + PHP + PostgreSQL 実験室]

PHP の基礎

とりあえず、前置き

プログラムで最初にやることと言えば、当然 K & R の伝統にしたがって「Hello World」を表示させることですこれもその例に漏れず、PHP で「Hello World」を表示させてみようと思います。あ、とその前に断っておきますが、簡単な html 言語を、知っていることを前提として話をさせてもらいます。また、何の言語でも良いので、プログラミングの経験があった方が、理解が早いかと思います。一応プログラミング未経験者に解るように書いているつもりですが、説明が下手なので理解に苦労するでしょう(ごめんね)。

PHP のプログラミングを始めるに当たって、必ずマニュアルを 参照してください。日本語の公式マニュアルが、PHP のホームページから参照できます。

UTF-8 で書かれていますので、ブラウザの表示する文字コードを、UTF-8 にして読んでください。プログラミングの経験者ならば、このファイルだけで、PHP で殆んどのことが出来るでしょう。構文の書き方や、関数一覧が書かれています。

PHP の言語としての特徴は、C 言語に似ていることです。ただし、csh にも似ています。と、言うのは、一つの構文でも、複数の書き方ができるからです。したがって、私の説明も「書き方の一つ」として受け取って頂きたいと思います。

Hello World の表示

PHP は、HTMLファイルの中に記述します。したがって、その HTMLファイルは、HTML のタグと、PHP の命令が混ざって書かれます。そして、この特殊な HTML ファイルが、PHP を使われているのが分かるように、拡張子を「php」になるようにして保存します。PHP の構文は、プログラミングの経験者にとって(C、csh、Perl など)、非常に簡単だと思います。まあ、どんな風に書くかみてもらった方が良いでしょう。

<? echo("Hello World"); ?>

ご覧のように、PHP の命令は、<??> の間に書きます。これは、複数行にまたがってもかまいません。<??> の間に、複数の命令を書く場合は、一つの命令の終りにセミコロン「;」を置く必要があります。まあ、安全を考えて、常に、セミコロンを書くようにした方が良いかも知れません。また、<?php?> で囲んでもいいし、script タグを使う方法もあります。

SGML 風
<?
  echo("Hello World<BR>");
  echo("Welcome PHP!!");
?>

XHTML/XML 風
<?php
  echo("Hello World<BR>");
  echo("Welcome PHP!!");
?>

HTML エディタの一部では、これが好ましい
<script language="php">
  echo("Hello World<BR>");
  echo("Welcome PHP!!");
</script>

ASP 風
<%
  echo("Hello World<BR>");
  echo("Welcome PHP!!");
%>

echo 命令は、シェルの echo と同じです。変数が指定されている場合は、変数を展開して表示させます。詳しくは、PHP のマニュアルを読んで頂くとして、簡単な使い方は分かって頂けたでしょうか? HTML ファイル全体のソースと、実行した結果を見てみてください。

PHP のマニュアルを見れば書いてありますが、実はこれ以外にも、この出力を抑制する方法はあります。ですが、他の説明と併せて、後で説明したいと思います。

最後に、コメントについてです。他の言語と同じように PHP ソース中にコメントを書くことができますが、これには、/* */ タイプと、// タイプがあります。

/*
  このコメントは、囲まれている場所がコメントとして扱われる
  複数行にわたっても大丈夫(もちろん一行でも)
*/
/*
  ただし、ネストはできない /* これは問題 */
*/
// このコメントは、行末までがコメント

$i = 1;  /* コメントを書く */
$j = 2;  // これでもいい

変数とリテラル

変数

PHP も他の言語の例に漏れず、変数を使用することができます。変数の型で代表的なのは、整数型、浮動少数型、文字列型です。ただし、PHP の場合、型の宣言は必要ありません。そのかわり、変数の頭にはドル記号「$」をつけます。初めて代入された値によって、変数の型が決まります(ここらへんは、Perl みたいですね)。次の3つの変数を見てみましょう。

<?php $a = 5; ?>
<?php $b = 5.0; ?>
<?php $c = "5"; ?>

変数 a 整数型、変数 b は浮動少数型、変数 c は文字列型になります。ただし、この型はたいして重要ではないようです。と言うのは、どうやら内部で3つの型に変換し、使う際に適切な型が選択され使われるからです。変数を使う際に注意してほしいのは、大文字と小文字が区別される点です。$a$A は、違う変数です。それぞれ別の値を保持することができます。

リテラル

ここで、変数を説明したついでに、リテラルについても説明しなければなりません。リテラルとは、変数を使わずに直接指定した文字や数値です。したがって、「$a = 5」は、$a は変数ですが、5 はリテラルです。数値の場合は、そのまま書けますが、文字列の場合は、ダブルクォーテーション「"」がシングルクォーテーション「'」で囲む必要があります。つまり、「"Hello World"」の様になります。数字でも、ダブルクォーテーション「"」で囲むと、文字として扱われます。

変数展開

ダブルクォーテーションで囲んだ文字列リテラル内に変数を指定すると、そこに変数の値が展開されます。したがって、

<?php
  $s = "Hiz Lab";
  echo("Hello $s World");
?>

上のような例では、「Hello Hiz Lab World」と表示されます。ちなみに、リテラルだけ(変数を含んでもよい)を表示したいのであれば、echo を使わず、「<?= ?>」を使う方法もあります。

<?= $s ?>
<?= "Hello $s World" ?>

ダブルクォーテーションで囲まれた文字列中では、変数が展開されることが分かったかと思いますが、実際に「Hello $s World」と表示したければ、ドル記号「$」の前にバックスラッシュ「\」(Windows だと円記号に見える)を指定しなければなりません。

<?php
  $s = "Hiz lab";
  echo("Hello \$s World");
?>

上のような指定すれば、「Hello $s World」と表示されます。また、文字列中にダブルクォーテーション「"」を表示したい場合も、同じように直前にバックスラッシュ「\」を指定する必要があります。あるいは、次のようにダブルクォーテーション「"」ではなく、シングルクォーテーション「'」で囲む方法もあります。シングルクォーテーションは、変数の展開がされません。

<?php
  $s = "Hiz lab";
  echo('Hello \$s World');
?>

文字列中の変数を展開させるときに、変数名の境界が分からない場合があります。この場合は、変数を中カッコ「{}」で囲みます。あるいは文字列を分けて、文字列を連結させる演算子であるピリオド「.」を利用してもいいです。

<?php
  $s = "Hiz";
  echo("$sLab");    /* これはダメ。sLab という変数を参照してしまう */
  echo("{$s}Lab");  /* これは期待通りに "HizLab" となる */
  echo($s."Lab");   /* これでもいい */
?>

配列

変数の説明に戻りますが、PHP では、変数の配列を使用することもできます。配列の意味が解らない人は、「同じ名前の変数を複数個作ることができる」と考えてください。もちろん、全く同じでは区別ができないので、変数名の後ろに [キー] をつけることにより、区別します。

<?php
  $name[0] = "Hizuya";
  $name[1] = "Seigo";
  $name[2] = "Dareka";
?>

この様に、同じ name と言う変数に、0 から 2 に対応した名前を格納することができます。[キー] の部分に、今は数値が指定されていますが、ここには、文字を指定することもできます。Perl の連想配列のようなものです。

<?php
  $age["Hizuya"] = "21";
  $age["Seigo"] = "20";
  $age["Dareka"] = "25";
?>

この様に、名前から歳を引き出すための変数を作ることも可能です。上手に使うと、非常に効果的です。ちなみに、キーは数値か文字列でないといけないため、文字列を指定する場合はダブルクォーテーションで囲んでありますが、変数を利用することもできます。

<?php
  $name = "Hizuya";
  $age[$name] = "21";
  
  $name_list[1] = "Seigo";
  $name_list[2] = "Dareka";
  $age[$name_list[1]] = "20";  /* $age["Seigo"] と同じ意味 */
  $age[$name_list[2]] = "25";
  
  echo($age["Hizuya"]); /* 21 と表示される */
  echo($age["Seigo"]);  /* 20 と表示される */
?>

また、配列をダブルクォーテーションで囲んだ文字列中で使うときは、キーを囲むダブルクォーテーションは必要ありません。

<?= "Hizuya is $age[Hizuya] years old." ?>

配列の具体的な利用例とかは、後で説明します。また、これ以外で可変変数と呼ばれる、変数もあります。もっと詳しく知りいたい方は、マニュアルを読んで下さい。

組み込み関数

PHP には、たくさんの組み込み関数が用意されています。関数は、0個以上の引数を取り、戻り値を返す物もあります。例えば、timeと言う関数があります。これは、次のように使います。

<?php $t = time(); ?>

time は引数を取りません(0個の引数)が、戻り値を返します。値の代入は、イコール「=」の右から左に入るので、time の戻り値は変数 $t に入ります。time は現在の日時(正確には、1970/1/1 0:00:00 からの経過秒数)を返しますので、$t 変数には、その日時が入ります。$t には、秒数が入っているので、これをそのまま表示してしまうと、とんでもない値が表示されます。したがって、この値を人間が読める日付の形式に変換する関数があります。date 関数は、この日時(経過秒数)を元に、指定された日付書式に従った文字列を返します。

<?php
  $t = time();
  $s = date("Y/m/d", $t);
  echo($s);
?>

上の例だと、「1998/02/15」と表示されます。date 関数は、2つの引数を取り、一つ目の引数がどんなフォーマットで日付を表現するかの指定です。マニュアルを読んでもらうと解りますが、、二番目の引数が実際の日時です。ここに、time 関数で取得した値を指定します。上の例では、time 関数の戻り値を一度変数で受けてから、date 関数に渡していますが、変数を介さずに、直接指定することも可能です。次の例と上の例は、全く同じ結果になります。

<?php
  $s = date("Y/m/d", time());
  echo($s);
?>

関数というのはどんな風に使うか解って頂けたでしょうか。マニュアルを見てもらうと解りますが、PHP では、関数名は大文字小文字の区別はされません。表現上の問題で、大文字が使われているようです(見易くする為だったり、自分が慣れている言語に似せるためとか)。以下に、関数についての規則をまとめておきます。

制御構文

フローを制御するための言語構造は、非常に簡単にできています。if switch while for がそれに当たりますが、とりあえず、順番に説明していこうと思います。

<?php
  if (条件):
    コード;
  endif;
?>

この様な感じで if 文を書くことができます。条件の部分には、次の節で説明する比較演算子等を使った評価式を書くことができます。条件の括弧の後にはコロン「:」、endif の後ろにセミコロン「;」を忘れないようにしてください。もし、この条件に合えば、「コード」が実行されます。もし、条件に合わなければ、endif の次に実行が移ります。他の言語の if 文と何ら変りはありません(書き方の違いを除いて)。また、この例の if 文を C言語風の書き方で表現することもできます。

<?php
  if (条件) {
    コード;
  }
?>

これは、上の if 〜 endif; と比べて、動作の違いはありません。表現の問題ですので、好きな方を使うと良いでしょう。中括弧「{ }」の後ろにはセミコロン「;」は必要ありません。if 文には、else 句も使うことができます。

<?php
  if (条件1):
    コード1;
  elseif (条件2):
    コード2;
  elseif (条件3):
    コード3;
  else:
    コード4;
  endif;
?>

elseif は0個以上、指定出来ます。最初の if に書かれている条件に合わなかった場合(上の例だと条件1)、次の elseif の条件が評価されます(上の例だと条件2)。この条件に合えば、そこに指定されているコードが実行されます(上の例だとコード2)。条件が合わなかった場合、次の elseif の条件が評価されます。どれかの条件に当てはまるか、または elseif が無くなるまで同じように繰り返されます。ifelseif の条件すべてに合わなかった場合、else が指定されていると、ここに指定されたコードが実行されます(上の例だとコード4)。else は省略可能です。

次に、switch について説明します。これも、2種類の書き方があります。

<?php
  switch (条件):
  case 値1:
    コード1;
    break;
  case 値2:
    コード2;
    break;
  default:
    コード3;
  endswitch;

  switch (条件) {
  case 値1:
    コード1;
    break;
  case 値2:
    コード2;
    break;
  default:
    コード3;
  }
?>

switch は多重分岐の構文です。条件が評価され、それに対応する「値」が書かれている case を上から探していきます。もし、対応する「値」が書かれていれば、その部分のコードが実行されます。上の例で言えば、「条件」の値が、「値1」ならば、コード1が実行されるし、「値2」ならばコード2が実行されます。case は1つ以上指定が可能です。

case に対応して、コードが書かれますが、その最後に break; と書かれています。この break というのは、そこに来たら endswitch の次から実行させるようにジャンプするための命令です。もし、この break が無い場合、例えばコード1が実行された後に、コード2も実行されてしまいます。ここら辺は、C 言語と同じです。default は、すべての case に指定してある値に合わなかった場合に実行されます。これは省略可能です。

次に、while について説明します。これも、前の構文と同じように、csh? ライクなのと C 言語ライクな、2種類の書き方があります。

<?php
  while (条件):
    コード;
  endwhile;

  while (条件) {
    コード;
  }
?>

これは、ループ構造です。条件が正しい場合、コードを繰り返し実行します。したがって、このループから抜け出る場合は、条件で評価する値を変化させるか、break を使い抜け出るしかありません。

while を使ったもので、do..while構文があります。これは、俗に出口条件と呼ばれるものです。次のようになります。

<?php
  do {
    コード;
  } while (条件);
?>

この構文は、上のような1つだけです。csh ライクな構文はありません。この構造の意味は、一度は必ずコード部分が実行されることです。一度コード部分が実行されたあと、条件が判定され、条件があっていればもう一度コードを実行します。そしてこれを繰り返します。

もう一つ、for 文もあります。これは、主にループする回数がわかっている場合に使います。たとえば次の式では、10回ループします。

<?php
  for ($i = 1; $i <= 10; $i++):
    コード;
  endfor;

  for ($i = 1; $i <= 10; $i++) {
    コード;
  }
?>

実際には、はじめに $i = 1 が実行されます。つまり、変数 $i1 が代入されます。次に、$i <= 10 が評価されます。この結果が正しければ、コードが実行されます。コードの実行が終わると、$i++ が実行されます。あとで説明しますが、これにより $i の値が +1 されて 2 になります。

次に、また $i <= 10 が評価されます。そしてその結果が正しければコードが実行され・・・、と続きます。途中で、条件に合わなくなると、for を抜け、ループを終了します。

いろいろな演算子

演算子にもいろいろありますが、まずは比較演算子から説明します。比較演算子には、< > <= >= == があります。以下に簡単な説明を描いておきます。

a < b      a は b より小さい
a > b      a は b より大きい
a <= b     a は b 以下
a >= b     a は b 以上
a == b     a と b は同じ

2つの論理演算子をサポートしています。C言語風の&&|| です。また、and or xor といった記号ではない文字列もサポートしています。

&&     論理積(and)
||     論理和(or)
!      否定(not)
and    論理積
or     論理和
xor    排他的論理和

次に算術演算子の説明です。算数の計算記号と同じです。+ - * /の4種類があります。

+      足し算
-      引き算
*      掛け算
/      割り算

文字列演算子として次のものがあります。これは、文字列動詞を連結するのに使います。Perl のそれと同じですね。

.      文字列の連結

ビット演算子もあります。C 言語風に & | ^ の4種類があります。

&      論理積(and)
|      論理和(or)
^      排他的論理和(xor)
~      否定(not)

代入演算子もサポートしています。+= -= *= /= .= &= |= ^= が使用できます。これらの意味は、次の例を見て理解してください。次の2行は全く同じ意味です。

<?php
  $a += $b;
  $a = $a + $b;
?>

単項演算子もあります。++ -- の2つが使用できます。

$a++;  a の値をインクリメント(+1)します
$a--;  a の値をデクリメント(-1)します
++$a;  a の値をインクリメント(+1)します
--$a;  a の値をデクリメント(-1)します

この、単項演算子が前にあるか、後ろにあるかで意味が違います。後ろにある場合、変数が参照されたあとに、中の値が変化するのに対し、前にある場合、中の値が変化したあとに参照されます。次の例を見てください。

<?php
  $a = 1;
  echo($a++);
  echo($a);
?>

これをすると、最初に 1 が表示され、次に 2 が表示されます。

<?php
  $a = 1;
  echo(++$a);
  echo($a);
?>

この様に、演算子が前にあると、両方とも 2 が表示されます。このように、参照(この場合は表示)と演算の順番が変わってくるので、旨く使い分ける必要があります。

ホームへ