WebアプリケーションのためのPHP

第2章 PHP入門

前へ | 目次へ |次へ  

2.1 変数

■変数名

 変数とは、文字や数値などの値を保存しておく場所のことです。変数には名前をつけて利用しやすくしています。変数に保存される値は、スクリプトの中で自由に入れ替えられます。

 PHPでは、変数をあらかじめ定義することなく使用します。変数に名前をつける際は以下のルールを守る必要があります。

・変数名は$ではじめる。
・変数名に使用する文字は、半角の英文字、数字、[_」(アンダーバー)にする。
・$に続く変数名の1文字目は半角の英文字か[_」(アンダーバー)にする。
  数字は使えない。

【注意】PHPでは変数名の大文字と小文字は区別します。$varと$VARは別の変数となります。

■代入文

 変数は、値を入れる器のようなものともいえます。変数を使う場合は、具体的な値を入れる必要があります。これを変数に値を代入するといいます。このような処理を行うスクリプトを代入文といい、以下ののように記述します。

変数名 = 式;

 ここで、式とは、値あるいは後に述べる演算子や関数などの組み合わせです。

 例を、リスト2.1.1に示します。

リスト2.1.1 var1.php

<html>
<head>
<title>var1.php</title>
</head>
<body>
<?php
 $x = 10;                    // 数値の代入
 $str_name = "山田";            // 文字列の代入
 print '$x = ' . $x .'<br>';
 print '$str_name = ' . $str_name .'<br>';
?>
</body>
</html>

 このファイルをドキュメントルートディレクトリのサブディレクトリ/phpにアップロードすることとします。

 URLは次のようになります。

http://localhost:8080/php/var1.php

 アクセスした結果は次のようになります。つまり、「=」の左側の文字列が変数名で、右側がの値が、変数に代入されている値を表示しています。

 リスト2.1.1では、変数$xには、数値の10を保存しています。変数$str_nameには、文字列の"山田"を保存しています。文字列であることを示すために、文字列の両端を「"」(ダブルクォーテーション)で囲む必要があります。
 「print '$x = ' . $x .'<br>';」の文は、文字列「 '$x = ' 」と変数$xの値と文字列「'<br>'」を連結した結果を、クライアントPCに送信しなさいという意味になります。ここでは、文字列であることを示すために、「'」(シングルクォーテーション)を使っています。

 「"」(ダブルクォーテーション)と「'」(シングルクォーテーション)はともに、文字列であることを示すために使う記号ですが、文字列の中に変数名が入っていると、その取り扱いが違ってきますので、注意が必要です。つまり、上記のように「'」(シングルクォーテーション)で囲んだ文字列の中に、「$x」のように変数名があっても、その変数名が文字列として、送信されるだけです。
  しかし。「"」(ダブルクォーテーション)で囲んだ文字列の中に、「$x」のように変数名があると、そこの部分は変数の値に置き換えた文字列として処理されます。たとえば、上の例で「print "$x = " . $x ."<br>";」は、「print "10 = " . $x ."<br>";」となってしまいます。

 ためしに、リスト2.1.1のprint文の「'」を「"」に置き換えたスクリプトをリスト2.1.2に示します。

リスト2.1.2 var2.php

<html>
<head>
<title>var2.php</title>
</head>
<body>
<?php
 $x = 10;                 // 数値の代入
 $str_name = "山田";            // 文字列の代入
 print "$x = " . $x ."<br>";
 print "$str_name = " . $str_name ."<br>";
?>
</body>
</html>

 この実施結果は、次のようになってしまいます。

■変数の有効範囲

 スコープ
  変数は、定義されたスクリプトの範囲内だけで有効です。スクリプトの範囲のことをスコープといいます。一般に記述するPHPのスクリプトの範囲をグローバルスコープと呼びます。後に述べるようにユーザ定義関数を定義した場合、関数の中のスクリプトの範囲は関数スコープあるいはローカルスコープと呼びます。

 グローバル変数
  グローバルスコープで定義した変数をグローバル変数と呼びます。グローバル変数は、関数スコープでは直接使用することはできません。関数スコープで、グローバル変数を使用するためには、関数内でその変数がグローバル変数であることをあらかじめl宣言をして使用する必要があります。

 

2.2 定数

■定数の定義

 スクリプトを実行するにあたって、最初に値を設定すれば以降変わらない値は定数として定義します。定数名をつける際は以下のルールを守る必要があります。

・変数名に使用する文字は、半角の英文字、数字、[_」(アンダーバー)にする。
・変数名の1文字目は半角の英文字か[_」(アンダーバー)にする。

【注意】定数名では、規定で大文字と小文字は区別します。一般に大文字を使います。

 定数は次の書式で定義します。

define( 定数名, 値 );

 定数は、スコープを意識せず、任意のスコープで定義し、特別の宣言をすることなく任意のスコープで使用できます。

 サンプルをリスト2.2.1に示します。

リスト2.2.1 const.php

<html>
<head>
<title>const.php</title>
</head>
<body>
<?php
 define( "DB_NAME", "db_test");       // 定数の定義
 print DB_NAME;
?>
</body>
</html>

 アクセス結果を以下に示します。

 この例では、定数「DB_NAME」に文字列の値「db_test」を定義しています。変数と違い、この値は、後でスクリプトで書き換えたり消去したりはできません。一方で、この定数「DB_NAME」は関数の中でも自由に宣言なしで参照できます。

 

2.3  リテラルとデータ型

 リテラルとは、スクリプトの中で記述する具体的な値あるいはその表現法のことです。数値の具体的な値あるいは表現法を数値リテラル、文字の具体的な値あるいは表現法を文字リテラルといいます。

■数値リテラル

 10進数の数値リテラルの例を以下に示します。

1234 -1234 +1234 1234.5

 8進数の数値リテラルの例を以下に示します。8進数は数値の前に「0」をつけます。

0123 (10進数の83と同じ)
-0123 (10進数の-83と同じ)

 16進数の数値リテラルの例を以下に示します。16進数は数値の前に「0x」をつけます。

0x12 (10進数の18と同じ)
0x1A (10進数の26と同じ)

 サンプルをリスト2.3.1に示します。

リスト2.3.1 literal1.php

<html>
<head>
<title>literal1.php</title>
</head>
<body>
<?php
// 数値リテラル
 $int_dec = 1234;    // 10進数
 $int_oct = 0123;    // 8進数(10進数の83)
 $int_hex = 0x1A;    // 16進数(10進数の26)
 print $int_dec;
 print "<br>";
 print $int_oct;
 print "<br>";
 print $int_hex;
?>
</body>
</html>

 アクセス結果を以下に示します。

■文字列リテラル

 文字列は、「'」(シングルクォート)あるいは「"」(ダブルクォート)で囲みます。

'Hello'
'123'
"Hello"
"山田 太郎"
"<br>"

 「"」(ダブルクォート)で囲まれた文字列の中に変数があると、その変数の値に置き換えられます。これを変数置換といいます。サンプルをリスト2.3.2に示します。

リスト2.3.2 literal2.php

<html>
<head>
<title>literal2.php</title>
</head>
<body>
<?php
// 文字列リテラルと変数置換
 $str = "Mr. Yamada";
 print 'Hello $str <br>';     // 'で囲まれた文字列
 print "Hello $str <br>";    // "で囲まれた文字列(変数置換が実行される)
?>

</body>
</html>

 アクセス結果を以下に示します。

 エスケープ記号
 
「"」(ダブルクォート)で囲まれた文字列ではエスケープシーケンス処理も実行されます。エスケープ記号には「\」を使用します。

 エスケープシーケンス処理とは特殊な記号処理のことです。タブや改行などは、普通の英数字では表現できないので、エスケープ記号を特別に定義して、これらの特殊な制御符号等をスクリプトの中で記述できるようにしています。PHPではエスケープ記号として「\」を使用します。タブや改行は以下のように記述します。

\t   タブのエスケープシーケンス
\n   改行のエスケープシーケンス

 サンプルをリスト2.3.3に示します。

リスト2.3.3 literal3.php

<html>
<head>
<title>literal3.php</title>
</head>
<body>
<?php
// エスケープシーケンス
 $str = "Hello\tMr. Yamada\n\n";
 print "$str <br>";        /* "で囲まれた文字列
                  (エスケープシーケンスが実行される) */
 print '$str <br>';       // 'で囲まれた文字列
?>
</body>
</html>

 アクセス結果を以下に示します。

 ブラウザでは、エスケープシークエンスのタブや改行の効果は表示されませんが、次図のようにブラウザに送られたソースコードを見ると、「Yamada」の後、2回改行されていることがわかります。ちなみに、ブラウザ上での改行は、「\n」でなく、「<br>」の改行タグで実行されます。

■データ型

 スクリプトで扱えるデータは、いくつかの種類に分類されます。それをデータ型といいます。PHPでは、基本として以下の4種類の型を扱うことができます。

整数(integer)
浮動小数点(float, double, real)
文字列(string)
論理値(boolean)

 異なるデータ型の値を用いた演算は、PHPが可能な範囲で自動的に相互変換を行い実行します。サンプルをリスト2.3.4に示します。

リスト2.3.4 literal4.php

<html>
<head>
<title>literal4.php</title>
</head>
<body>
<?php
// 異なる型の演算
 $var_int = 123;          // 整数
 $var_str = "456";        // 文字列
 print $var_int + $var_str;    // 整数と文字列の加算
 print "<br>";
 print $var_int . $var_str;    // 整数と文字列の連結
?>
</body>
</html>

 結果を以下に示します。

 文字列は算術演算子で数値に自動変換
  文字列は算術演算子があると、自動的に数値に変換され演算処理されます。「print $var_int + $var_str;」では算術演算子の「+」があるので、直後の変数$var_str内の文字列データ「"456"」は数値の「456」に自動変換され、「123」との間で加算処理され、結果は数値の「579」として表示されます。

 数値は文字列連結演算子で文字列に自動変換
  逆に、数値は文字列連結演算子があると、文字列に自動変換され処理されます。「print $var_int . $var_str;」では、文字列連結演算子「.」があるので、直前の変数$var_int内の数値データ「123」は文字列の「"123"」に自動変換され、「"456"」との間で文字列連結処理され、結果は文字列の「"123456"」として表示されます。

 

2.4 演算子

 演算子とは、たとえば四則演算のための「+、−、*、/」などの計算のための記号のことです。

■式

 PHPにおけるもっとも基本的な構成要素です。値をもつものはすべて式といえます。値や変数、配列、関数単体やそれを演算子で関連つけたスクリプトなどです。以下は式の例です。

5
5+5
$a
$a[1]
$a==5
sqrt(3)

■算術演算子

 主に二つの式を使って、計算しその結果の値を返します。サンプルをリスト2.4.1に示します。

リスト2.4.1 operand1.php

<html>
<head>
<title>operand1.php</title>
</head>
<body>
<?php
// 演算子
 $a = 20;
 $b = 3;
 $add = $a + $b;   // 加算
 $sub = $a - $b;   // 減算
 $mul = $a * $b;  // 乗算
 $div = $a / $b;   // 割算
 $rem = $a % $b;  // 剰余
 print "$add<br>";
 print "$sub<br>";
 print "$mul<br>";
 print "$div<br>";
 print "$rem<br>";
?>
</body>
</html>

 アクセス結果を以下に示します。

 加算子「++」と減算子「--」
  なお、特殊な演算子に加算子(インクリメント)「++」と減算子(デクリメント)「--」があります。加算子は変数の値を1増やし、減算子は変数の値を1減らします。
  ただし、これらの演算子は変数の前に記述した場合と後ろに記述した場合で動作が異なるので注意が必要です。たとえば、++$aと記述した場合は、$aの値を1増やした後、$aの値が評価されます。逆に$a--と記述した場合は、$aの値を評価した後、$aの値を1増やします。サンプルをリスト2.4.2に示します。

リスト2.4.2 operand2.php

<html>
<head>
<title>operand2.php</title>
</head>
<body>
<?php
// 加算子と減算子
 $a = 5;
 print ++$a . " ";         // 1を加算した後、出力する
 print "$a<br>";
 $a = 5;
 print $a++ . " ";         // 出力した後、1を加算する
 print "$a<br>";
 $a = 5;
 print --$a . " ";         // 1を減算した後、出力する
 print "$a<br>";
 $a = 5;
 print $a-- . " ";         // 出力した後、1を減算する
 print "$a<br>";
?>
</body>
</html>

 アクセス結果を以下に示します。

■代入演算子

 代入演算子「=」は、変数に値を代入します。代入演算子の左側の項(左オペランドという)は、値を格納できる要素でなくてはいけません。代入演算子の右側の項(右オペランドという)は、式でなくてはいけません。サンプルをリスト2.4.3に示します。

リスト2.4.3 operand3.php

<html>
<head>
<title>operand3.php</title>
</head>
<body>
<?php
// 代入演算子
 $val = 10;         // 値の代入
 $var = $val;        // 変数の値を代入
 $ope = $var + 20;    // 演算結果を代入
 $str = "abcde";     // 文字列を代入
 $ret = strlen( $str );  // 関数の戻り値を代入
 print "$val<br>";
 print "$var<br>";
 print "$ope<br>";
 print "$str<br>";
 print "$ret<br>";
?>
</body>
</html>

 アクセス結果を以下に示します。

 「$ret = strlen( $str );」で、「strlen()は引数の文字列の長さを計算する組み込み関数です。計算結果は、関数名自身に代入されています。これを戻り値といいます。この場合、引数の文字列は「"abcde"」で、その長さは5文字ですから、戻り値は「5」となります。

■比較演算子

 比較演算子は二つのオペランドの大小関係などの比較を行います。条件が満たされる(真)場合論理値のtrueを返し、満たされない(偽)場合論理値のfaluseを返します。サンプルをリスト2.4.4に示します。

リスト2.4.4 comparison.php

<html>
<head>
<title>comparison.php</title>
</head>
<body>
<?php
// 比較演算子
 $name = "yamada";
 if ( $name == "yamada" ) // $name と"yamada"が等しければtrue
 {            
   print "等しい";
 }
?>
</body>
</html>

 アクセス結果を以下に示します。

 「$name == "yamada"」の「==」は比較演算子の一つの「等しい」かどうかを比較する演算子です。この場合、変数$nameの値も「 "yamada"」なので、比較演算子「==」の両側のオペランドの値が等しく、演算した結果はtrueとなります。その結果if文の条件が成立し、if文の中の文が実行され、「"等しい"」の文字列が表示されます。

■論理演算子

 論理演算子は複数の条件を結合します。サンプルをリスト2.4.5にに示します。

リスト2.4.5 logical.php

<html>
<head>
<title>logical.php</title>
</head>
<body>
<?php
 // 論理演算子
 $name = "yamada";
 $year = 30;
 if ( $name == "yamada" && $year >= 30 )/*$name と"yamada"が等しくかつ
 {                       $yearが30以上ならばtrue */
                               
   print "条件成立";
 }
?>
</body>
</html>

 アクセス結果を以下に示します。

 「$name == "yamada" && $year >= 30」では、後で述べるように、「==」や「>=」の比較演算子の方が「&&」の論理演算子より優先的に処理されます。この例では、「$name == "yamada"」がtrueで、「 $year >= 30」もtrueですから、「$name == "yamada" && $year >= 30」は「true && true」で、結果としてtrueと評価されます。したがって、if文の条件が成立し、if文の中の文が実行され、「"条件成立"」の文字列が表示されます。

■文字列連結演算子

 文字列連結演算子は二つのオペランドを文字列として結合します。サンプルをリスト2.4.6に示します。

リスト2.4.6 connect.php

<html>
<head>
<title>connect.php</title>
</head>
<body>
<?php
// 文字列結合演算子
 $name1 = "山田";
 $name2 = "太郎";
 print $name1 . " " . $name2;    // 姓と名の間に空白を挿入する
?>
</body>
</html>

 アクセス結果を以下に示します。

■エラー制御演算子

 エラー制御演算子「@」を式の目前に記述すると、その式でエラーが発生してもエラーメッセージが表示されません。サンプルをリスト2.4.7にに示します。2回目の割算のときのエラーメッセージが表示されていないのがわかります。

リスト2.4.7 error_cont.php

<html>
<head>
<title>error_cont.php</title>
</head>
<body>
<?php
// エラー制御演算子
 $a = 10;
 $b = 0;
 print $a / $b;   // 0で除算すると通常はエラーメッセージが表示されます
 print @($a / $b);  // @をつけるとエラーメッセージは表示されません
 print "<br>";
 print "$a / $b";

?>
</body>
</html>

 アクセス結果を以下に示します。

 2回目の割算のときのエラーメッセージが表示されていないのがわかります。

■複合演算子

 複合演算子は代入演算子と他の演算子を組み合わせて短く記述したものです。サンプルをリスト2.4.8に示します。

リスト2.4.8 multiple.php

<html>
<head>
<title>multiple.php</title>
</head>
<body>
<?php
// 複合演算子
 $a = 10;
 $b = 20;
 $c = $a + $b;
 $a += $b;        // $a + $b の結果を$aに代入する
 print "$c<br>";
 print $a;
?>
</body>
</html>

 アクセス結果を以下に示します。

 「$a += $b;」文で、「+=」は、左右のオペランドの加算演算の結果を左側のオペランドに代入しなさいという複合演算子です。プログラミングのタイピングの文字数を少しでも減らして、より早くプログラミングできるようにするための工夫の結果と言われています。

■演算子の優先順位

 演算子の優先順位は、二つの式が"緊密に"結合している度合いを指定します。 例えば、式 1 + 5 * 3 の答えは 16になり、18とはなりません。 これは乗算演算子("*")は、加算演算子("+")より高い優先順位を有するか らです。必要に応じて強制的に優先順位を設定するために括弧を使用する ことが可能です。例えば、18と評価するためには、 (1 + 5) * 3 とします。 サンプルをリスト2.4.9にに示します。

リスト2.4.9 priority.php

<html>
<head>
<title>priority.php</title>
</head>
<body>
<?php
// 演算子の優先順位
 $a = 1+5*3;    // *が先に処理されるので、$aは16
 $b = (1+5)*3;   // ( )の中が先に処理されるので、$bは18
 $c = 100/20*5;  // 左の演算子から先に処理されるので、$cは25
 $d = $e = 20;   // 代入演算子は右から順に処理されるので、$dも$eも20
 print "$a<br>";
 print "$b<br>";
 print "$c<br>";
 print "$d<br>";
 print "$e<br>";
?>
</body>
</html>

 アクセス結果を以下に示します。

 

2.5 配列

■配列

 一つの変数で複数の値を格納することができます。このような変数を配列型変数あるいは単に配列といいます。配列内の値を参照するために、添字(インデックスあるいはキーとも言う)を用います。

配列名[添字]

 配列の名をつける際は以下のルールを守る必要があります。

・配列名は$ではじめる。
・配列名に使用する文字は、半角の英文字、数字、[_」(アンダーバー)にする。
・$に続く変数名の1文字目は半角の英文字か[_」(アンダーバー)にする。

 添字
  添字には、数値か文字列を使います。数値の場合は、0以上の整数値を使います。整数値は必ずしも連続している必要はありません。PHPでは、配列を使用するにあたってあらかじめ配列を宣言する必要はありません。変数と同様、配列に値を代入した時点で、配列が生成されます。サンプルをリスト2.5.1に示します。

リスト2.5.1 array1.php

<html>
<head>
<title>array1.php</title>
</head>
<body>
<?php
// 配列
 $arr_num[0] = 100;         // 添字付配列への代入
 $arr_num[1] = 110;
 $arr_num[3] = 130;
 print "$arr_num[0]<br>";
 print "$arr_num[1]<br>";
 print "$arr_num[3]<br>";
?>
</body>
</html>

 アクセス結果を以下に示します。


 添字を省略することもできます。その場合、使われているインデックスの最大値に1を加算した値が添字として使用されます。最初の添字は0です。1でないので注意が必要です。サンプルをリスト2.5.2に示します。

リスト2.5.2 array2.php

<html>
<head>
<title>array2.php</title>
</head>
<body>
<?php
// 添字なしの配列への代入
 $arr_num[] = 90;            // 添字は0となる
 $arr_num[10] = 110;
 $arr_num[] = 130;            // 添字は11となる
 $arr_num[] = 150;            // 添字は12となる
 print "$arr_num[0]<br>";
 print "$arr_num[10]<br>";
 print "$arr_num[11]<br>";
 print "$arr_num[12]<br>";
?>
</body>
</html>

 アクセス結果を以下に示します。

 array()関数
  配列に値を代入する別の方法は、array()関数を使う方法です。その書式は次のようになります。

配列名 = array(値1,値2,・・・・・・値n);

 配列名の右隣に添字「[ ]」は記述する必要はありません。サンプルをリスト2.5.3に示します。

リスト2.5.3 array3.php

<html>
<head>
<title>array3.php</title>
</head>
<body>
<?php
// array()関数による配列への値の代入
 $arr_weekday = array("日","月","火","水","木","金","土");  
 print "$arr_weekday[0]<br>";
 print "$arr_weekday[1]<br>";
 print "$arr_weekday[2]<br>";
 print "$arr_weekday[3]<br>";
 print "$arr_weekday[4]<br>";
 print "$arr_weekday[5]<br>";
 print "$arr_weekday[6]<br>";
?>
</body>
</html>

 アクセス結果を以下に示します。

array()関数で、添字を指定して配列に値を代入することができます。書式は次の通りです。添字の数値は連続でも不連続でも構いません。

配列名 = array(数値1 => 値1,数値2 => 値2,・・・・・・,数値n => 値n);

 サンプルをリスト2.5.4に示します。

リスト2.5.4 array4.php

<html>
<head>
<title>array4.php</title>
</head>
<body>
<?php
// array()関数による配列への値の代入
 $arr_weekday = array(1 => "日",2 => "月",3 => "火",4 => "水"
            ,5 => "木",6 => "金",7 => "土");  
 print "$arr_weekday[1]、";
 print "$arr_weekday[2]、";
 print "$arr_weekday[3]、";
 print "$arr_weekday[4]、";
 print "$arr_weekday[5]、";
 print "$arr_weekday[6]、";
 print "$arr_weekday[7]<br>";
?>
</body>
</html>

 アクセス結果を以下に示します。

■連想配列

 添字に文字列を使用する配列を連想配列といいます。あるいはハッシュと呼ぶ場合もあります。添字の文字列は「'」か「"」で囲む必要があります。サンプルをリスト2.5.5に示します。

リスト2.5.5 array5.php

<html>
<head>
<title>array5.php</title>
</head>
<body>
<?php
// 連想配列への代入
 $arr_data['氏名'] = "山田太郎";   
 $arr_data['住所'] = "横浜市都筑区";
 print $arr_data['氏名'];
 print "<br>";
 print $arr_data['住所'];
?>
</body>
</html>

 アクセス結果を以下に示します。

 リスト2.5.5で、配列への値の代入にarray()関数を使うことができます。そのサンプルをリスト2.5.6に示します。

リスト2.5.6 array6.php

<html>
<head>
<title>array6.php</title>
</head>
<body>
<?php
// 連想配列へのarray()関数による代入
 $arr_data = array("氏名" => "山田太郎", "住所" => "横浜市都筑区");   
 print $arr_data['氏名'];
 print "<br>";
 print $arr_data['住所'];
?>
</body>
</html>

 アクセス結果はリスト2.5.5の場合と同じになります。

 

2.6 制御構造

 スクリプトは一般に、上の行の文から1行づつ順次下の行の文が実行されます。

 条件分岐
  ただし、場合によっては、ある条件の場合には、次の行ではなく、何行かスキップして先の行の文を実行できると好都合の場合があります。
 ループ
  あるいは、少しづつ条件を変えて、繰り返し何行分かの同じ処理を実行できると好都合な場合もあります。

 このように、実行する行を制御するスクリプトのことを制御構造といいます。制御構造には条件分岐とループがあります。

■if

 if文は、命令の条件実行を可能にします。最も単純なif文の書式は次の通りです。

if ( 式 )
  文

 式がtrueなら、文が実行されます。式がfaluseならば、文は実行されず文の次の行が実行されます。サンプルをリスト2.6.1に示します。

リスト2.6.1 if.php

<html>
<head>
<title>if.php</title>
</head>
<body>
<?php
// if文
 $menu = "A";
 if ( $menu == "A" )         // 条件が成立するので、次のprint文が実行される
   print "メニューAを実行します";
?>
</body>
</html>

 アクセス結果を以下に示します。

 条件判断の結果、実行する文が複数ある場合は、次の書式のように「{}」を使用してブロックにします。

if ( 式 )
{
  文1
  文2
}

 サンプルをリスト2.6.2に示します。

リスト2.6.2 if2.php

<html>
<head>
<title>if2.php</title>
</head>
<body>
<?php
// if文
 $menu = "A";
 if ( $menu == "A" )
 {                   // 複数の文を実行するのでブロックにする
   print "メニューAを実行します<br>";
   print $menu;
 }                   // ブロックの終了
?>
</body>
</html>

 アクセス結果を以下にに示します。

■else

 条件が成立したときに文1を実行し、条件が成立しないときは文2を実行するようにいずれか一方を実行するには、次の書式のif〜else〜文を使います。

if ( 式 )
{
  文1
}
else
{
  文2
}

 サンプルをリスト2.6.3に示します。

リスト2.6.3 else.php

<html>
<head>
<title>else.php</title>
</head>
<body>
<?php
// if〜else〜文
 $a = 5;
 if ( ($a % 2) == 0 )
 {                    // 余りが0の場合
   print $a . "は偶数です<br>";
 }
  else
 {                    // 余りが0でない場合
   print $a . "は奇数です<br>";
 }
?>
</body>
</html>

 アクセス結果を以下に示します。

■elseif

 二つ以上の条件で分岐して実行したい場合は、次の書式のようにif〜elseif〜文を使います。

if ( 式1)
{
  文1
}
elseif ( 式2 )
{
  文2
}
elseif ( 式3 )
{
  文3
}
else
{
  文4
}

 たとえば、式2がtrueで文2を実行するとif文を抜け出し、式3等はもはや評価されません。サンプルをリスト2.6.4に示します。

リスト2.6.4 elseif.php

<html>
<head>
<title>elseif.php</title>
</head>
<body>
<?php
// if〜elseif〜文
 $marks = 75;
 if ( $markas >= 80 )         // 第1の条件判定
 {
  print "ランクAです<br>";
 }
 elseif ( $marks >= 70 )      // 第2の条件判定
 {
   print "ランクBです<br>";
 }
 elseif ( $marks >= 60 )      // 第3の条件判定
 {
    print "ランクCです<br>";
 }
 else                  // その他の条件の場合
 {
    print "ランクDです<br>";
 }
?>
</body>
</html>

 アクセス結果を以下に示します。

■Switch

 Switch文では、式を評価しその値によって処理先を分岐します。書式は次のようになります。

switch( 式 )
{
  case 値1;     //値の後ろに「:」(コロン)を記述します
    文1       //式の値が値1の場合にここにジャンプします
    break;      //break文でswtich文を抜け出します
  case 値2:
    文2       //式の値が値2の場合にここにジャンプします
    break; 
  case 値3:
    文3
    break;      //式の値が値3の場合にここにジャンプします
  default:       //defaultは省略できます
    文4       //式の値に一致する値nがない場合はこの文を実行します
}

 サンプルをリスト2.6.5に示します。

リスト2.6.5 switch.php

<head>
<title>switch.php</title>
</head>
<body>
<?php
// switch文
 $menu = "メニューC";
 switch ( $menu )              //$menuの値によって分岐します
 {
   case "メニューA" :           // 1回目の値の判定による分岐
     print "メニューAを実行します";
     break;               // switch文を抜け出す
   case "メニューB" :           // 2回目の値の判定による分岐
     print "メニューBを実行します";
     break;
   case "メニューC" :          // 3回目の値の判定による分岐
     print "メニューCを実行します";
     break;
   default :               // 一致する値がない場合の分岐(省略可能)
     print "該当するメニューはありません";
     break;
}
?>
</body>
</html>

 アクセス結果を次に示します。

 このサンプルでは、$menuの値を評価して分岐します。$menuの値が"メニューC"なので、3回目の値判定がtrueになり、「print "メニューCを実行します";」の文を実行します。

■while

 while文はループの一つです。
  while文は、式がtrueの間、コードブロックを繰り返し実行します。書式は次のようになります。

while ( 式 )
{
  コードブロック
}

 つまり、式を評価し式がtrueならば、コードブロックを実行し、再度式を評価します。式が最初からfalseの場合、コードブロックは一度も実行されません。サンプルをリスト2.6.6に示します。

リスト2.6.6 while.php

<html>
<head>
<title>while.php</title>
</head>
<body>
<?php
// while文
 $i = 1;              // $iを1で初期化
 while ( $i <= 3 )         // $iが3になるまで繰り返す
 {
   print $i++ . "<br>";     // $iは出力後1加算
 }
 print "while文を終了しました。<br>";
?>
</body>
</html>

 アクセス結果を以下に示します。

 $iの値は最初1で、$iの値が順次加算されて値がが4になった時点で「($i <= 3)」がfalseになり、while文を抜け出します。

■for

 for文は、一見複雑ですが、変数の初期化、継続条件式、変数のインクリメントを一つのかっこ内で行うため、プログラムミスを未然に防ぐことが可能です。書式は次のようになります。

for (式1; 式2; 式3)
{
  コードブロック
}

 最初の式(式1)は、変数の初期化を行います。ループ開始時に無条件に 評価(実行)されます。

 各繰り返しの開始時に、式2の継続条件式が評価されます。 その式の値がtrueが場合、ループは継続され、かっこ内のコードブロックが実行されます。値がfalseの場合、ループの 実行は終了します。

 各繰り返しの後、式3の変数のインクリメントが評価(実行)されます。

 各式は、空とすることができます。式2を空 にすることは、無限実行ループを意味します。

 サンプルをリスト2.6.7に示します。

リスト2.6.7

<html>
<head>
<title>for.php</title>
</head>
<body>
<?php
 // for文
 for ($i = 1; $i <=3; $i++)    // $iの値が1〜3について繰り返します
 {

   print "$i<br>";
 }
 print "for文を終了しました";
?>
</body>
</html>

 アクセス結果を以下に示します。

■foreach

 foreach文もループですが、配列のすべての要素について処理する場合に利用します。書式は次のようになります。

foreach(配列 as $value)
{
  コードブロック
}

 配列の各要素の値は順次変数$valueに代入されます。

 サンプルをリスト2.6.8に示します。

リスト2.6.8

<html>
<head>
<title>foreach.php</title>
</head>
<body>
<?php
 // array()関数による配列への値の代入
 $arr_weekday = array('日','月','火','水','木','金','土');
 // foreach文
 foreach ($arr_weekday as $value)
 {
  print "$value<br>";
 }
 print "foreach文を終了しました<br>";
?>
</body>
</html>

 アクセス結果を以下に示します。

 配列$arr_weekdayの値が順次$valueに代入され、foreach文内で処理されます。

 foreach文で、配列のキーも参照したいときは、次の書式を使います。

foreach(配列 as $key => $value)
{
  コードブロック
}

 各配列要素のキーが$keyに値が$valueに代入されます。

 サンプルをリスト2.6.9に示します。

リスト2.6.9

<html>
<head>
<title>foreach2.php</title>
</head>
<body>
<?php
 // 連想配列への代入
 $arr_data['氏名'] = "山田太郎";
 $arr_data['住所'] = "横浜市都筑区";
 // foreach文
 foreach($arr_data as $key => $value)
 {
   print "$key = $value<br>";
 }
 print "foreach文を終了しました。<br>";
?>
</body>
</html>

 アクセス結果を以下に示します。

 最初の配列要素では、キーの'氏名'が$keyに代入され、値の'山田太郎'が$valueに代入されます。このように配列のキーも参照し使用することができます。

■break

 break文を使うと、現在実行中の for, foreach while, do..while, switchなどのループの実行を途中で終了させることができます。 サンプルをリスト2.6.10に示します。

リスト2.6.10 break.php

<html>
<head>
<title>break.php</title>
</head>
<body>
<?php
 $arr_name = array ('kato', 'saito', 'tanaka', 'yamada', 'wajima');
 // break文
 foreach ($arr_name as $value)         // 配列の要素を順に$valueに代入する
 { 
   if ( $value == 'yamada' )
    {
      print $value . "さんで終わります<br>";
      break;                   // 'yamada'まできたらforeachを抜け出す
    }
    print "$value<br>";
 }
 print "break文でfoeach文を抜け出しました<br>";
?>
</body>
</html>

 アクセス結果を以下に示します。

 配列$arr_nameの値を順次$valueに代入し、if文で$valueの値が'yamada'に等しいか毎回チェックします。そして、'yamada'に等しくなったときにif文の中に処理が移り、break文が実行され、foreach文から抜け出します。

■continue

 continueは、ループにおいて現在の繰り返しループ の残りの処理をスキップし、次の繰り返しの最初から実行を続けるために 使用されます。

 サンプルをリスト2.6.11に示します。

リスト2.6.11 continue.php

<head>
<title>continue.php</title>
</head>
<body>
<?php
 // continue文
 $i = 0;
 while (++$i <= 10)
 {
   if ( $i % 2 ) continue;    // 奇数のときにスキップ
   print "$i<br>";
 }
?>
</body>
</html>

 アクセス結果を次にに示します。

 「if ( $i % 2 )」は、$iを2で割った余りを評価しています。余りは0か1で、1のときtrueとなりif文が実行されます。つまり余りが1のときのみcontinue文が実行され、while文の残りの処理つまり、if文の後の「print "$i<br>";」の実行はスキップされます。つまり、$iが偶数のときは「print "$i<br>";」の実行はスキップされ、奇数のときは実行されます。

 

2.7 組込み関数

■関数

 関数はあるひとまりの処理を行うためのスクリプトの集まりに名前をつけたものです。PHPにあらかじめ組み込まれた組込み関数とユーザが新たに定義するユーザ定義関数があります。

■引数と戻り値

 スクリプトのある場所で関数を使うことを関数を呼び出すといいます。関数を呼び出すときに、呼び出す側から関数に対してある値を引き渡すことができます。この引き渡す値のことを引数といいます。引数はない場合もあります。引数の数は任意です。呼び出された関数は引数で与えられた値を利用して処理を行い、実行結果を返します。実行結果の値は戻り値と呼ばれ、関数名にその値が代入されています。

■関数の呼び出し

 関数の呼び出し書式は一般に次のようになります。

戻り値 = 関数名(引数1、引数2);

サンプルをリスト2.7.1に示します。

リスト2.7.1 php_function.php

<head>
<title>php_function.php</title>
</head>
<body>
<?php
// 組込み関数の例
 $str = "yamada";
 $length = strlen($str);    /* 組込み関数strlen()の
                     戻り値を$lengthに代入
*/
 print $str . "の文字列の長さは" . $length . "です。<br>";
?>
</body>
</html>

 アクセス結果を以下に示します。

 組み込み関数strlen()は、引数の文字列の長さをはかり、その長さの値を返します。上の例では、引数の文字列は、"yamada"でその長さは6です。したがって、組み込み関数strlen()の戻り値は6で、変数$lengthに、戻り値の値6が代入されます。

 

2.8 ユーザ定義関数

 関数はユーザが独自に定義することも可能です。関数の定義は次のような書式で行います。関数を記述する場所は、関数を呼び出す位置の前でも関数を呼び出す位置の後でもどこでも構いません。

function 関数名(引数1, 引数2, 引数3)   // 引数の数は任意。なくてもよい
{
  スクリプ
  return 戻り値;                // 戻り値を使う場合はreturn文
}

 戻り値がある場合は、return文の後に記述します。戻り値がない場合は、return文は省略してもかまいません。

 戻り値がないユーザ定義関数のサンプルをリスト2.8.1に示します。このユーザ定義関数では、引数1の値が0以外のときに、変数の値を表示します。デバッグのときに使うと便利です。

リスト2.8.1

<?php
// ユーザ定義関数の定義
function disp_var($disp,$var,$var_name)
{
 if($disp == 0){return;}
 print $var_name . " = " . $var . "<br>";
}
?>
<html>
<head>
<title>user_function1.php</title>
</head>
<body>
<?php
// ユーザ定義関数の使用例
 $name = "yamada";
 disp_var(1,$name,'$name');   // ユーザ定義関数の呼び出し
?>
</body>
</html>

 

 アクセス結果は、次のようになります。

 ユーザ定義関数disp_var()は、第一の引数の値が0の時は、何もしないで即戻ります。第一の引数の値が0以外のとき(上の例では1)は、第2の引数の変数の名前と変数の値を" = "で結んで、表示します。そのために、第2の引数には変数の値を、第3の引数には変数の名前を設定し関数に引き渡しています。
  なお、第3の引数は変数の名前を渡す必要があるので、変数名を必ず「'」で囲む必要があります。変数名を「"」で囲むと、変数の値に変換されてしまいます。上の例ですと、'$name'でなく、"$name"としてしまうと、$nameが変数として評価され、その値である"yamada"に変換されてしまいます。表示される結果は、yamada = yamada になってしまいます。

 戻り値があるユーザ定義関数のサンプルをリスト2.8.2に示します。

リスト 2.8.2

<?php
// ユーザ定義関数の定義
function tags_convert($str) {
/* $str中の以下のHTMLタグ等に使う文字をおのおのHTML特殊文字に変換します。
 「&」->「&amp;」
 「<」->「&lt;」
 「>」->「&gt;」
 「"」->「&quot;」
*/
 $str = str_replace("&","&amp;",$str);
 $str = str_replace(">","&gt;",$str);
 $str = str_replace("<","&lt;",$str);
 $str = str_replace('"',"&quot;",$str);
 return $str;              // 戻り値の設定
}
?>
<html>
<head>
<title>tags_convert.php</title>
</head>
<body>
<?php
// ユーザ定義関数の使用例
 $str_in = "<html><body>A&B</body></html>";
 $str_out = tags_convert($str_in);     // ユーザ定義関数の呼び出し
 print $str_out;              // 戻り値の表示
?>
</body>
</html>

 アクセス結果は、次のようになります。

 ユーザ定義関数tags_convert()内のstr_replace()関数は組み込み関数で、文字列の置き換え処理を行います。第3の引数の文字列の中に、第1の引数の文字列があれば、第2の引数の文字列に置き換えます。たとえば、最初の文では、変数$strの中に文字"&"があればそれを文字列"&amp"に置き換えます。置き換えた結果の文字列は再度$strに代入されますから、$strに対して、第2、第3、第4の置き換え処理をすべて実施することになります。すべての変換処理が終わった文字列は変数$str内に代入されていますから、この値をユーザ定義関数tags_convert()の戻り値とするために、最後の行に「return $str;」と記述します。

 サンプルリストの下のほうでは、このユーザ定義関数tags_convert()を使って、HTMLのソースコード"<html><body>A&B</body></html>"をそのままブラウザに表示できるよう、HTMLタグ文字をprint文による表示の前にあらかじめ変換しています。ユーザ定義関数tags_convert()の置換処理後の戻り値は変数$str_outに代入されています。

 

2.9 include

 include文は指定されたファイルをスクリプト中のその場所に読み込み、評価します。

 サンプルをリスト2.9.1に示します。アクセス結果を図4.38に示します。

リスト2.9.1

○読み込まれるファイル1 user.php

<?php
// ユーザ用読み込みファイル(user.php)
// 定数
define( DEBUG, 1 );    /* DEBUG=1 デバグを行う時
                DEBUG=0 デバグを行わない時 */
?>

○読み込まれるファイル2 common.php
<?php
// 共通用読み込みファイル(common.php)
// 関数
function disp_var($disp,$var,$var_name)
{
  if(DEBUG == 0){return;} /* 定数_DEBUGの値は、user.phpの
                中で定義されている */
  if($disp == 0){return;}
  print $var_name . " = " . $var . "<br>";
}


○読み込む側のファイル include.php

<?php
// include文
include "user.php";  /* 'user.php'ファイルを
             この位置に読み込みます*/
include "common.php"; /* 'common.php'ファイルを
              この位置に読み込みます*/
?>
<html>
<head>
<title>include.php</title>
</head>
<body>
<?php
 $name = "yamada";
 disp_var(1,$name,'$name'); /* ユーザ定義関数disp_var()は
                includeファイル'common.php'
                の中で定義されている。*/
 disp_var(1,DEBUG,'DEBUG'); /* 定数DEBUGはincludeファイル
                 'user.php'の中で定義されている。*/
?>
</body>
</html>

 include.phpへのアクセス結果を以下に示します。なお、user.phpファイルとcommon.phpファイルはinclude.phpファイルと同じディレクトリに保存することとします。

 include.phpファイルで呼び出しているユーザ定義関数disp_var()は、同じinclude.phpファイルの中ではなく、includeファイルcommon.phpの中で定義され、include.phpファイルの冒頭で読み込まれています。この結果、ユーザ定義関数disp_var()はinclude.phpファイルの中で定義されたと同様に扱うことができます。
 このようにして、複数のphpファイルで共通に使用しそうなユーザ定義関数は、 common.phpのような共通のincludeファイル上にまとめて定義しておき、個々のphpファイルにインクルードするようにしておけば、スクリプトを効率よく作成することができます。

 また、include.phpファイルで参照している定数DEBUGは、同じinclude.phpファイルの中でなく、includeファイルuser.phpの中で定義され、include.phpファイルの冒頭で読み込まれています。このようにデバグ専用の定数や、あるWebアプリケーションでユーザ固有のいわゆるカスタマイズ用の定数や変数などは、user.phpのようなユーザ固有のincludeファイル上にまとめて定義しておき、個々のphpファイルにインクルードするようにしておけば、スクリプトを効率よく作成することができます。

 

2.10 変数の有効範囲 (スコープ)

■グローバルスコープ

 定義された変数は一般にグローバルスコープを有し、同じphpファイル中や、include文で読み込まれたファイル中でその変数を参照することができます。サンプルをリスト2.10.1に示します。

リスト2.10.1 global_scope.php

<html>
<head>
<title>global_scope.php</title>
</head>
<body>
<?php
// グローバルスコープ
 $str = "global_scope";      // グローバルスコープの変数
 include 'global_scope.inc';   // 読み込みファイル内で、$strを処理
 print $str . "<br>";       // 同じスクリプト内で、$strを処理
?>
</body>
</html>

読み込みファイル global_scope.inc
<?php
// global_scope.inc
 print $str . " 読み込みファイル中<br>";
?>

 アクセス結果を以下に示します。

 読み込む側のファイルglobal_scope.php内で値が代入された変数$strは、読み込まれた側のファイルglobal_scope.inc内でも同様に参照できることがわかります。

ローカルスコープ

 ユーザ定義関数内で定義された変数は、定義された関数内のみで有効です。このような変数はローカルスコープをもつといいます。したがって、グローバルスコープの変数と同一名の変数をユーザ定義関数内で使用しても両者は別変数とみなされます。

 サンプルをリスト2.10.2に示します。

リスト2.10.2 local_scope.php

<html>
<head>
<title>local_scope.php</title>
</head>
<body>
<?php
// グローバルスコープ
 $str = "local_scope";      // グローバルスコープの変数
 output_str( );         // ユーザ定義関数内で同名の$str変数を処理
 print "グローバルスコープ<br>";
 print $str . "<br>";      // 同じスクリプト内で、$strを処理

function output_str( )      // ユーザ定義関数
{
// ローカルスコープ
 print "ローカルスコープ<br>";
 print $str . "<br>";       /* ローカル変数であり、未定義なので
                      何も出力されない
*/
 $str = "global_scope";         
}
?>
</body>
</html>

 アクセス結果を以下に示します。

 変数$strには、最初にグローバルスコープ内で"local_scope"の文字列が代入されている。その直後にユーザ定義関数output_str( )が呼ばれ、output_str( )関数内で、変数$strの表示を行っているが、グローバルスコープ内で代入された文字列"local_scope"は表示されず、何も表示されない。これは、ユーザ定義関数内での変数は一般にユーザ定義関数内のみで有効だからで、したがって、グローバルスコープ内の変数$strとユーザ定義関数output_str内の変数$strは全く別物だからである。したがって、ユーザ定義関数output_str内で変数$strに"global_scope" を代入しても、グローバルスコープ内の変数$strには反映されない。。

■global

 ユーザ定義関数内でグローバル変数を参照したり値を処理する場合は、引数で渡すか、global文を使って関数内で定義しなおす必要があります。サンプルをリスト2.10.3に示します。アクセス結果を図4.45に示します。

リスト2.10.3 global.php

<html>
<head>
<title>global.php</title>
</head>
<body>
<?php
// global文
 $str = "global_scope";       // グローバルスコープの変数
 output_str( );           // ユーザ定義関数内で同名の$str変数を処理
 print  グローバルスコープ<br>";
 print $str . "<br>";        /* 同じスクリプト内で、$strを処理
                    ユーザ定義関数内で変更された値が出力される */
//

// ユーザ定義関数の定義
function output_str( )       // ユーザ定義関数
{
  global $str;           // グローバル変数を使用することを宣言
  print  "ローカルスコープ<br>";
  print $str . "<br>";      // グローバル変数の値が出力される
  $str = "local_scope";      // グローバル変数の変更
} 
?>
</body>
</html>

 アクセス結果を以下に示します。

 このサンプルでは、ユーザ定義関数内で、変数$strのglobal宣言がなされているので、グローバルスコープ内の変数$strと、ローカルスコープ内の変数$strは同一変数として処理される。

 

2.11 正規表現

■正規表現とは

 正規表現は文字の組み合わせを定義したパターンを使用し、そのパターンに適合(マッチ)する文字列を検索したり、置換したりするのに使います。

■PHPで利用できる正規表現

 PHPには2種類の正規表現が用意されています。一つは、POSIX準拠の正規表現です。IEEEによって規定されたUNIX系OSの基本的な仕様です。

 もう一つはPerlに準拠した正規表現です。ここでは、より高機能なPerl互換の正規表現について扱います。

■正規表現の書式

 マッチングに使用するパターン文字列は次の書式で記述します。

/パターン文字列/パターン修飾子

 「/」はデリミタと呼ばれ、パターン文字列の先頭と末尾につけられる。一般に「/」(スラッシュ」が使用される。 パターン修飾子はオプションです。

■文字(リテラル)

 文字列そのものもパターンに記述することができます。大文字と小文字は区別されます。サンプルをリスト2.11.1に示します。

リスト2.11.1 preg_literal.php

<html>
<head>
<title>preg_literal.php</title>
</head>
<body>
<?php
// 文字(リテラル)
 $arr_str = array ( 'abc', '123abc','123abc456','ABC','123ABC','bcd' );
 foreach ( $arr_str as $str )
 {
   if ( preg_match( "/abc/", $str ) )  // 文字列パターン/abc/の検索
   {
     print "$str<br>";        // 一致した場合に出力
   }
 }
?>
</body>
</html>

 アクセス結果を以下に示します。

 「preg_match( "/abc/", $str )」は、変数$strの中に文字列"abc"があるかどうか検索し、あればtrueの値を返します。

■任意の文字「.」

 「.」(ピリオド)はメタ文字として使用した場合、改行以外の任意の1文字をあらわします。サンプルをリスト2.11.2に示します。

リスト2.11.2 preg_meta_any.php

<html>
<head>
<title>preg_meta_any.php</title>
</head>
<body>
<?php
// メタ文字:「.」任意の文字
 $arr_str = array ( 'abc', '123abc','123abc456','ABC','123ABC','bcd' );
 foreach ( $arr_str as $str )
 {
    if ( preg_match( "/abc./", $str ) )   // 文字列パターン/abc./の検索
    {
      print "$str<br>";          // 一致した場合に出力
    }
 }
?>
</body>
</html>

 アクセス結果を以下に示します。

 「abc」や「123abc」の文字列は「c」の後に1文字もないことから一致しないことがわかります。

 

2.12 正規表現関数

 正規表現パターンを用いた検索や置換はデータベースを利用したWebアプリケーションではよく使います。PHPでは、そのために正規表現パターンを用いて処理する正規表現関数が準備されています。

 正規表現検索で使用する関数には、preg_match関数、preg_match_all関数、preg_grep関数があります。

 正規表現検索・置換で使用する関数には、preg_replace関数があります。

 正規表現パターンを用いた文字列の分割に使用する関数には、preg_split関数があります。

■preg_match()

 対象文字列の中にパターン文字列にマッチするものがあるかないかをチェックするにはpreg_match関数を使用します。preg_match関数の書式は次のとおりです。

preg_match(パターン文字列, 対象文字列)

 サンプルのリストを2.12.1に示します。

リスト2.12.1 preg_match.php

<html>
<head>
<title>preg_match.php</title>
</head>
<body>
<?php
// preg_match関数
 $str = "WEB means a server system using world wide web technology.";
                      //
 if( preg_match( "/\bweb\b/" , $str ) )  // preg_match関数の呼び出し
 {                    // $bは単語境界を意味する
    print "マッチしました";
 } else {
    print "マッチしません";
 }
?>
</body>
</html>

 アクセス結果を以下に示します。

 正規表現で\bは単語境界を意味します。したがって、"/\bweb\b/"は"web"という単語の意味です。

preg_replace

 preg_replace関数は、マッチした文字列を別の文字列に置き換えます。preg_replace関数は次の書式で使用します。

preg_replace( パターン文字列、置換文字列、対照文字列 )

 サンプルをリストを2.12.2に示します。アクセス結果を図4.61に示します。

リスト2.12.2 

<html>
<head>
<title>preg_replace.php</title>
</head>
<body>
<?php
// preg_replace関数:文字列の置換
 $str = "Homepages is written by HTML Language.";
 $str_res = preg_replace( "/\bhomepages\b/i" , "webpages", $str );
                       // preg_replace関数の呼び出し
 print $str_res . "<br>";
?>
</body>
</html>

preg_replace

 preg_replace関数は、マッチした文字列を別の文字列に置き換えます。preg_replace関数は次の書式で使用します。

preg_replace( パターン文字列、置換文字列、対照文字列 )

 サンプルをリストを2.12.2に示します。アクセス結果を図4.61に示します。

リスト2.12.2 

<html>
<head>
<title>preg_replace.php</title>
</head>
<body>
<?php
// preg_replace関数:文字列の置換
 $str = "Homepages is written by HTML Language.";
 print $str . "<br>";
 $str_res = preg_replace( "/\bhomepages\b/i" , "webpages", $str );
                      // preg_replace関数の呼び出し
 print $str_res . "<br>";
?>
</body>
</html>

 アクセス結果を以下に示します。

preg_split

 preg_split関数は、対象の文字列を指定した正規表現にマッチする部分で分割します。preg_splitの書式は次の通りです。戻り値は配列で、分割された部分文字列が要素として格納されます。

preg_split( 正規表現, 対象文字列 )

 サンプルをリストを2.12.3に示します。アクセス結果を図4.63に示します。

リスト2.12.3 preg_split.php

<html>
<head>
<title>preg_split.php</title>
</head>
<body>
<?php
// preg_split関数:文字列の分割
 $str = "/usr/local/apache/htdocs/php";
 $arr_res = preg_split( "/\//" , $str );    /* preg_split関数の呼び出し
                         「/」で文字列を分割 */
 foreach( $arr_res as $val )
 {
   print $val . "<br>";
 }
?>
</body>
</html>

 アクセス結果を次に示します。

 

2.13 日本語処理

■日本語文字セット

Webアプリケーションで使用される日本語文字セットには以下のものがあります。

日本語文字セット 概要
ISO-2022-JP ・別名JISコード
・ISO-2022規格に採用されている。
・漢字はエスケープシーケンスで切り替える
Shift-JIS ・別名SJISコード
・Microsoft社によって作成された。
・文字コードの1バイト目で文字種を識別できる
EUC ・UNIX環境で日本語処理を行うための文字コード
・AT&T社によてって作成された。
Unicode ・多言語を1つの文字セットで表現するために近年開発された。
・ISOで標準化
・すべての文字は2バイトで表現されるが、65536文字しか表現できないという限界がある。

■PHPでの日本語処理

 PHPは、基本的にISO-8859-1用に設計されているため、SJISコードなどは、PHPで正常に動作しません。このため、 mbstring.internal_encoding にPHPで動作する文字 エンコーディングを設定することが必要です。

PHPの内部文字コードとして使用可能な文字コードと 使用できない文字コードの例を以下に示します。

PHPで動作する内部文字コード:    ISO-8859-*, EUC-JP, UTF-8

PHPで動作しない内部文字コード:  JIS, SJIS

 PHPの内部文字コードとして使用できない文字コードは、 mbstringのHTTP入力/出力変換の機能/関数により変換 することが可能です。

【注意】 SJIS は、読者がパーサ/コンパイラ、文字エンコーディングと文字エン コーディングの問題点について精通していない限り内部文字コードとして使用するべきではありません。 一般的には EUCコードを使用します。

【注意】 PHPでデータベースを使用する場合、性能を向上させるためにデータベー スとPHPの内部文字コードについて同じ文字文字コードを使用 することを推奨します。 一般的には EUCコードを使用します。

■PHPのインストールと日本語処理

 PHPをコンパイルするときに、以下の設定オプションがmbstringモジュールに関係し ています。

--enable-mbstring : mbstring 関数を有効にします。このオプションは、 mbstring 関数を利用するために必要です。

--enable-mbstr-enc-trans : mbstring変換エンジンを使用したHTTP入力の文 字エンコーディング変換を有効にします。この機能が有効の場合、 HTTP入力文字エンコーディングは、自動的に mbstring.internal_encodingに変換されます。

【注意】PHP 4.3.0以降、このオプション --enable-mbstr-enc-trans は廃止され、mbstring.encoding_translation に変更となります。HTTP入力文字エンコーディング変換は、 このオプションをOnに設定した場合のみ 有効となります。 (デフォルトは、Offです。)

--enable-mbregex : マルチバイト対応の正規表現関数を使用可能とします。

■日本語処理用マルチバイト文字列関数

mb_convert_case -- 文字列に対してケースフォルディングを行う
mb_convert_encoding -- 文字エンコーディングを変換する
mb_convert_kana -- カナを("全角かな"、"半角かな"等に)変換する
mb_convert_variables -- 変数の文字コードを変換する
mb_decode_mimeheader -- MIMEヘッダフィールドの文字列をデコードする
mb_decode_numericentity -- HTML数値エンティティを文字にデコードする
mb_detect_encoding -- 文字エンコーディングを検出する
mb_detect_order -- 文字エンコーディング検出順序の設定/取得
mb_encode_mimeheader -- MIMEヘッダの文字列をエンコードする
mb_encode_numericentity -- 文字をHTML数値エンティティにエンコードする
mb_ereg_match -- マルチバイト文字列が正規表現に一致するか調べる
mb_ereg_replace -- マルチバイト文字列に正規表現による置換を行う
mb_ereg_search_getpos -- 次の正規表現検索を開始する位置を取得する
mb_ereg_search_getregs -- マルチバイト文字列が正規表現に一致する部分があるか調べる
mb_ereg_search_init -- マルチバイト正規表現検索用の文字列と正規表現を設定する
mb_ereg_search_pos -- 指定したマルチバイト文字列が正規表現に一致する部分の位置と長さを返 す
mb_ereg_search_regs -- 指定したマルチバイト文字列が正規表現に一致する部分を取得する
mb_ereg_search_setpos -- 次の正規表現検索を開始する位置を設定する
mb_ereg_search -- 指定したマルチバイト文字列が正規表現に一致するか調べる
mb_ereg -- マルチバイト文字列に正規表現マッチを行う
mb_eregi_replace -- マルチバイト文字列に大文字小文字を区別せずに正規表現による置換を行う
mb_eregi -- マルチバイト文字列に大文字小文字を区別しない正規表現マッチを行う
mb_get_info -- mbstringの内部設定値を取得する
mb_http_input -- HTTP入力文字エンコーディングの検出
mb_http_output -- HTTP出力文字エンコーディングの設定/取得
mb_internal_encoding -- 内部文字エンコーディングの設定/取得
mb_language -- カレントの言語を設定/取得
mb_output_handler -- 出力バッファ内で文字エンコーディングを変換するコールバック関数
mb_parse_str -- GET/POST/COOKIEデータをパースし、グローバル変数を設定する
mb_preferred_mime_name -- MIME文字設定を文字列で得る
mb_regex_encoding -- カレントの正規表現用のエンコーディングを文字列として返す
mb_regex_set_options -- マルチバイト正規表現関数のデフォルトオプションを取得または設定する
mb_send_mail -- エンコード変換を行ってメールを送信する
mb_split -- マルチバイト文字列を正規表現により分割する
mb_strcut -- 文字列の一部を得る
mb_strimwidth -- 指定した幅で文字列を丸める
mb_strlen -- 文字列の長さを得る
mb_strpos -- 文字列の中に指定した文字列が最初に現れる位置を見つける
mb_strrpos -- 文字列の中に指定した文字列が最後に現れる位置を見つける
mb_strtolower -- 文字列を小文字にする
mb_strtoupper -- 文字列を大文字にする
mb_strwidth -- 文字列の幅を返す
mb_substitute_character -- 置換文字の設定/入手
mb_substr_count -- 副文字列の出現関数を数える
mb_substr -- 文字列の一部を得る 【参考】

マルチバイト文字列関数(mbstring)
( http://de3.php.net/manual/ja/ref.mbstring.php )

 


前へ | 目次へ |次へ  | YCポータルサイト

執筆 山田豊通
更新日: 2006年7月21日