投稿日 ・ 更新日 ・ 約37分で読めます

【独習PHP】変数・配列から制御構文・関数まで

詳しい説明はあとあと! 決まりごとという型を作ってしまうと、自分で自分のクビを絞めることになる場合も。 例えば「仕事を始める前には必ずストレッチをやろう」という型を作ると、当然それを守れない時がでてくるわけです。その日はずっと気持ちが悪い。ずっと気持ちが悪いのは、型という不快になるためのスイッチを自分で仕掛けたからですよね。

という話とは全く関係ない上に唐突なのですが、PHPの勉強を始めたいと思います。

PHPのテストには、CODA(Mac版のみです)というソフトを使うことにします。 画面を上下2分割にして上をエディタ、下をプレビューにする。こうしておくと保存するたびにプレビュー画面が更新されるので、ほぼリアルタイムでの動作確認が可能です。

「.php」や「.ini」ファイルの文字コードをEUC-JP、改行コードをLFに統一したほうが良いとのことなので、とりあえずそれに従います。

まずはこれをやらないと始められないということで、

<?php
print ('Hello, World!');
?>
Hello, World!

それでは、PHPの勉強を始めたいと思います。以下、「独習PHP」を元に、要約メモしておきたいと思います。

変数

コメントタグ

単一行は//もしくは#(非推奨)、複数行は/*〜*/。

変数を使う

<?php
$data='これが変数です';
print($data);
?>
これが変数です

変数名の命名規則

  • 変数名は$で始まること(×:data、○:$data)
  • 変数名の2文字目は英字かアンダースコアであること(×:$9_z、○:$z_9)
  • 変数名の3文字目以降は、英数字、アンダースコアのいずれかであること(×:$%&、$名前、○:$name、$btn_01)
  • 変数名の大文字/小文字は区別される

ダブルクォーテーション(")と、シングルクォーテーション(')の違い

<?php
$title='これ'; $data1="「 $title 」は変数です。";
$data2='「 $title 」は変数です。';
print($data1);
print($data2);
?>
「 これ 」は変数です。 「 $title 」は変数です。

ダブルクォーテーション(")は変数として解釈されるが、シングルクォーテーション(')は文字列としてそのまま出力される。変数名の前後はスペースで明確に区切ること。

可変変数

先頭に$をふたつつけることで、変数名を変数によって決めることができる変数のこと。

<?php
$x='title';
$title='タイトル名です';
print($$x);
?>
タイトル名です

配列

仕切りのある入れ物のこと。ひとつの変数に対してひとつの値を持つものをスカラー変数といい、配列のように複数の値を持つことができる入れ物のことを非スカラー変数という。

array命令

array(要素1,要素2,...) array(キー1=>要素1,キー1=>要素1,...)

通常配列

<?php
$data=array(0=>'ひとつ',1=>'ふたつ',2=>'みっつ',3=>'よっつ');
print($data[3]);
?>
よっつ

連想配列

<?php
$data=array('ひとつ'=>'1個','ふたつ'=>'2個','みっつ'=>'3個');
print($data['みっつ']);
?>
3個

キーが省略された場合には、その時点でのキーの最大値+1が振り分けられる。 デフォルトでは「0,1,2,3,...」だけど、下記の場合キー2を飛ばしてキー3が割り振られているので、次からはキー4,5,6,...という風に割り振られていく。

<?php
$data=array('1'=>'one','3'=>'three','four','five','six');
print($data[6]);
?>
six

ネスト構造(入れ子)

<?php
$data=array(
array('A','B'),
array('C','D'),
array('E','F'),
);
print ($data[2][0]);
?>
E

ブラケット([])構文

<?php
$data=array('ひとつ','ふたつ','みっつ');
$data[0]='いくつ'; //キー0の要素を書き換え
$data[]='よっつ'; //最後に要素を追加
print($data[0]);
print('<br />'); //改行する
print($data[3]);
?>
いくつ よっつ

非スカラー変数の内容を視覚的に見やすい形で出力する。 ブラウザ上では改行されていない状態で表示されるので、ブラウザでソースを表示すると見やすい。

<?php
$data=array('ひとつ','ふたつ','みっつ');
$data[0]='いくつ';
$data[]='よっつ';
print_r($data)
?>
Array ( [0] => いくつ [1] => ふたつ [2] => みっつ [3] => よっつ )

スーパーグローバル変数

$_POST

POST形式のHTMLフォーム(

タグのmethodオプションが"POST")から入力された情報(ポストデータ)を取得するためのスーパーグローバル変数。

<form method="POST" action="POST2.php">
名前:
  <input type="text" name="name" size="15" />
  <input type="checkbox" name="food[]" value="orange" />
  みかん
  <input type="checkbox" name="food[]" value="apple" />
  りんご
  <input type="checkbox" name="food[]" value="strawberry" />
  いちご
  <input type="submit" value="送信" />
</form>

名前: みかん りんご いちご

上記のようなHTMLフォームから入力された値を取得する場合は、

post2.php

名前:<?php print($_POST['name']); ?>
好きな食べ物:<?php print_r($_POST['food']); ?>

名前:山田 好きな食べ物:Array ( [0]=>orange [1]=>apple [2]=>strawberry )

$_POSTの中身は連想配列になっているので、個々の要素値にアクセスするには$_POST['要素名']のようにする。チェックボックスやリストボックスのように同名の要素が複数の値を持つ場合には、要素を名前[]のように指定する。print_r命令ではなく、個々の値にアクセスする場合は、

$_POST['food'][0]

とする。

$_GET

クエリ情報を取得するためのスーパーグローバル変数。クエリ情報とは、URLの末尾以降(?〜)に付加されたキー名=値のセットのことをいう。キー名=値のセットを&で連結して、複数の情報を送信することも可能。

get.php

名前:<?php print($_GET['name']); ?>
性別:<?php print($_GET['sex']); ?>

上記のget.phpに対して、

http://localhost/~user/get.php?name=Ohmori&sex=male

でアクセスすると

名前:Ohmori 性別:male

と表示される。

クエリ情報の制約

  • 送信可能なデータサイズに制限がある ポストデータには原則としてサイズ制限がないのに対して、クエリ情報のデータサイズはWebサーバが受け取ることができるURLの長さに制約される。一般的には最大でも数百バイト程度。
  • 予約文字やマルチバイト文字は使用できない ポストデータでは原則としてあらゆる文字データを扱うことが可能だが、クエリ情報ではファイル名との区切り文字である?をはじめ、&や%、空白、マルチバイト文字(日本語)などは使用できない。これらがクエリ情報に含まれている可能性がある場合には、あらかじめ無害な文字列(%xxの形式)に変換する必要がある。urlencodeという命令でこうした変換処理(URLエンコード)を行うことができる。
  • データが露出する ポストデータはリクエスト情報の本体として送信されるので問題ないが、クエリ情報はその性質上、ブラウザのアドレス欄にそのまま露出してしまうし、サーバのログに記録させる場合がある。ログインパスワードのような情報をクエリ情報を介してやりとりするのは好ましくない。

$_FILES

アップロードしたファイルに関する情報を取得するためのスーパーグローバル変数。ファイルのアップロード機能を作成することができる。

file1.php

<form method="POST" action="file2.php" enctype="multipart/form-data">
ファイルのパス:
<input type="file" name="uploaded" size="50" />
<input type="submit" value="アップロード" />
</form>

ファイルのパス:

file2.php

<?php
move_uploaded_file($_FILES['uploaded'['tmp_name'], './doc/'.$_FILES['uploaded']['name']);
print ('アップロードに成功しました');
?>

ファイルをアップロードするには、

タグのenctypeオプションに必ず"multipart/form-data" をセットする必要がある。'./doc/'と$_FILES['uploaded']['name']とをつなぐ「.」は、文字列連結演算子と呼ばれ、2つの文字列を連結する際に利用する。 PHPでクライアントから受け取ったファイルを移動するには、move_uploaded_file命令を使用する。その一般的な構文は以下。

move_uploaded_file(対象となるファイルのパス, 移動先のパス)

対象となるファイルのパスは、スーパーグローバル変数を介して取得することができる。$_FILESは、$_POSTや$_GETとは異なり、2次元配列として与えられ、以下の表のような情報を保持している。'file'は、HTMLフォームで指定された要素名。

要素名 概要
$_FILES['file']['name'] オリジナルのファイル名
$_FILES['file']['tmp_name'] サーバ上で管理された一時的なファイル名
$_FILES['file']['size'] アップロードファイルのサイズ(バイト)
$_FILES['file']['type'] アップロードファイルのMIMEタイプ(ファイルの種類)
$_FILES['file']['error'] エラーコード

アップロードがうまくいかない場合の原因を知るためには、$_FILES['file']['error']を介してエラーコードを取得する。$_FILESによって返されるエラーコードは以下。

定数 値 概要
UPLOADED_ERR_OK 0 アップロード成功
UPLOADED_ERR_INI_SIZE 1 アップロードファイルのサイズがupload_max_filesizeパラメータ(php.ini)の指定値を超過
UPLOADED_ERR_FILE_SIZE 2 アップロードファイルのサイズがHTMLフォームのhiddenフィールド"MAX_FiLE_SIZE"で指定された値を超過
UPLOADED_ERR_PARTIAL 3 アップロードファイルの一部しかアップロードされていない
UPLOADED_ERR_NO_FILE 4 アップロード失敗

UPLOAD_ERR_INI_SIZE、UPLOAD_ERR_NO_FILEが返された場合には、php.iniの以下のパラメータを見直す。

パラメータ 概要
upload_max_filesize アップロードのサイズ制限
memory_limit スクリプトが使用可能なメモリサイズ
post_max_size ポストデータのサイズ制限
max_execution_time スクリプトのタイムアウト時間(秒)

アップロードサイズの制限に引っかかっていなくてもポストデータのサイズ制限に引っかかっている場合もある。また、異動先のディレクトリに書き込み権限がない場合もエラーになるので、パーミッションを確認する。 UPLOAD_ERR_FILE_SIZEが返された場合には、HTMLフォーム内に以下の記述がないかを確認し、値を編集する。

<input type="hidden" name="MAX_FILE_SIZE" value="30000" />

$_SERVER

クライアントの種類や対応言語、サーバから送信されたコンテンツの種類やデータサイズなどの情報が、クライアント/サーバそれぞれで内部的に生成され、リクエスト/レスポンス時に送信されている。このような付随情報はヘッダ情報と呼ばれ、クライアント側から送信されるものはリクエストヘッダ、サーバ側から送信されるものはレスポンスヘッダと呼ばれる。スーパーグローバル変数$_SERVERで取得できるのは、このうちのリクエストヘッダ。

主なリクエストヘッダ

ヘッダ名 概要
HTTP_ACCEPT クライアントがサポートしているコンテンツの種類(優先順位)
HTTP_ACCEPT_LANGUAGE クライアントが対応している言語(優先順位)
HTTP_AUTHORIZATION 認証情報
HTTP_COKKIE クライアントに保存されているクッキーデータを送信
HTTP_HOST 要求先のホスト名
HTTP_IF_MODIFIED_SINCE 指定された日時以降にコンテンツが更新されている場合にのみ、サーバからデータを受信
HTTP_PROXY_AUTHORIZATION プロキシサーバ用の認証情報
HTTP_RANGE 要求するリソースの範囲
HTTP_REFERER リンク先のURI
HTTP_USER_AGENT クライアントの種類

たとえば、User-Agentヘッダを取得する場合は次のようになる

<?php
print ($_SERVER['HTTP_USER_AGENT']);
?>

Webサーバであらかじめ定義された定義済みサーバ変数を取得することも可能。Apacheを利用している場合は、次のような情報を取得することができる。

変数名 概要 戻り値(例)
DOCUMENT_ROOT ドキュメントルート C:/Program Files/htdocs
GATEWAY_INTERFACE

CGIのリビジョン

CGI/1.1
PHP_SELF 実行中のスクリプト /samples/server.php
QUERY_STRING クエリ文字列 category=PHP
REMOTE_ADDR クライアントのIPアドレス 127.0.0.1
REMOTE_PORT クライアントのポート番号 2856
REQUEST_METHOD HTTPメソッド POST
REQUEST_URI 指定されたURI /samples/server.php?category=PHP
SCRIPT_FIMENAME 実行中のスクリプト C:/Program Files/htdocs/samples/server.php
SCRIPT_NAME 実行中のスクリプト /samples/server.php
SERVER_NAME サーバ名 localhost
SERVER_PORT サーバのポート 80
SERVER_PROTOCOL プロトコル名、リビジョン HTTP/1.0
SERVER_SIGNATURE サーバのバージョン Apache/2.0.55(Win32)PHP/5.1.1 Server at localhost Port 80
SERVER_SOFTWARE サーバのソフトウェア Apache/2.0.55(Win32)PHP/5.1.1

$_ENV

サーバ側で設定された環境変数を取得するためのスーパーグローバル変数。環境変数とはサーバ固有のパラメータを表すもので、プログラム実行時に参照するパスやオプション値などを設定する。たとえば環境変数PATHはコマンドラインなどでプログラムを読み出す場合にデフォルトで検索するディレクトリを指定する。

$_ENVを利用したサーバ環境変数の取得例

env.php

<?php
print ($_ENV['Path']);
?>

C:¥WINDOWS¥system32;...

クライアントに保存されているクッキーの値を取得するためのスーパーグローバル変数。セキュリティ的な理由から、一般的にはサーバはクライアント上のファイルを勝手に読み書きできないが、クッキーだけは例外で、自由にテキストを読み書きすることができる。

cookie1.php

<form method="POST" action="cookie2.php">
E-Mailアドレス:
  <input type="text" name="email" size="30" value="<?php print ($_COOKIE['email']); ?>" />
  <input type="submit" value="送信" />
</form>

cookie2.php

<?php
setcookie ('email',$_POST['email'], time()+60*60*24*90);
print ('クッキー"email"を保存しました');
?>

cookie1.phpにアクセスしてE-Mailアドレスを入力すると「クッキー"email"を保存しました」が表示される。もう一度cookie1.phpにアクセスすると、初回アクセスで入力したE-Mailアドレスがデフォルト表示されている。

setcookie命令の一般的な構文は次のとおり

setcookie(クッキー名, 値 [,有効期限 [,対象のホスト [,対象のパス]]])

対象ホスト/パスを設定した場合には、該当のクッキーをどのホスト/パスから参照可能にするかを限定できる。デフォルトでは、現在のホスト配下のすべてのパスから読み込むことが可能。有効期限はタイムスタンプ値として指定する。タイムスタンプとは「1970年1月1日からの経過秒」を表す値。上記の例では、取得したタイムスタンプに「60秒×60秒×24時間×90日」の値を加算することで、クッキーの有効期限を90日に設定した。90日を経過したクッキーは自動的に破棄されるようになる。クッキーの有効期限を省略した場合には、ブラウザを閉じたタイミングで破棄され、有効期限を現在よりも前に設定した場合は、その場で破棄される。

$_SESSION

前項のクッキーにはいくつかの問題点がある。

  • データがクライアント側で保存される クッキーで管理されたデータはクライアント側で自由に削除したり改ざんしたりすることが可能。そのため、クッキー情報をもとにアプリケーション全体の挙動を左右するような判定を行うのは危険。
  • 実データがネットワーク上を流れる 通信経路上にリクエスト情報をロギングするような通信機器やソフトウェアがある場合には、クッキー情報が漏洩してしまう可能性がある。

そこで、ユーザがブラウザを開いている間だけ情報を維持したいという場合には、よりセキュアなセッションというしくみを利用する。

  1. 【クライアント】1回目のリクエスト→【サーバ】
  2. 【クライアント】←セッションIDの発行【サーバ】
  3. 【クライアント】2回目以降の要求→【サーバ】
  4. 【サーバ】セッションIDをキーにセッション情報を取得
  5. 【クライアント】←セッション情報を送信【サーバ】

クッキーと異なる点は以下

  • データがサーバ側で保存される
  • ネットワーク上を流れるのはセッションIDだけ

したがって、データがクライアント側で改ざん/削除される可能性が原則としてないし、実データがネットワーク上を行き来しないので、データを盗聴される危険性も相対的に低下する。

session1.php

<?php
session_start();
$_SESSION['sample']='セッション情報(テスト)';
print ('セッション情報"sample"が保存されました。');
?>

session2.php

<?php
session_start();
print ('セッション情報"sample"の値は「'$_SESSION['sample'].'」です。');
?>

最初にsession1.phpにアクセスした後、session2.phpにアクセスすると、sesion1.phpで登録したセッション情報がsession2.phpで参照される。

セッション情報"sample"の値は「セッション情報(テスト)」です。

もしページ毎にsession_start命令を実行するのが面倒な場合は、php.iniでsession.auto_startをOnにすることで省略することも可能。ただし、セッションを利用しないページでもセッションが有効になってしまう点に注意する。必要なページだけでセッションを有効にすれば、サーバリソースをいくらか節約することができる。

定数

変数は、その中身をプログラムの途中で変更/編集することが可能だが、定数は入れ物と中身がセットになっていて、途中で中身を変更できない入れ物。プログラム上、意味を持つ値にあらかじめ名前を付けておくしくみ。

 

<?php
define ('TAX', 1.05);
$price=1000;
$sum=$price*TAX;
print($sum);
?>

1050

defineは定数を設定するための命令で、ここでは定数TAXを1.05という値で設定している。あとからTAXの値を変更する場合にも便利。また、1.05という数値だけだと何の数値なのか分からない(マジックナンバー)ので、定数で名前付けしておけばデータの意味が視覚的にも明確になる。

定数の命名規則

  • 定数名の先頭には$は使わない(×:$DATA、○:DATA)
  • 定数名の先頭は英字かアンダースコアであること(×:9A、○:A9)
  • 定数名の2文字目以降は、英数字、アンダースコアのいずれかであること(×:A9+、○:NAME)
  • 変数名の大文字/小文字は区別されない

変数と区別するために定数は大文字にするのが通例。

定義済みの定数

定数 概要
__FILE__ 実行中のファイル名
__LINE__ 実行中の行番号
__FUNCTION__ 実行中の関数名
__CLASS__ 実行中のクラス名
__METHOD__ 実行中のメソッド名
DIRECTORY_SEPARATOR ファイル区切り文字(Winは¥、Linuxは/)
RATH_SEPARATOR パス区切り文字(Winは;、Linuxは:)
PHP_VERSION 使用しているPHPのバージョン
NULL 未定義
TRUE 真
FALSE 偽

DIRECTORY_SEPARATOR や RATH_SEPARATOR など、環境に依存する情報をハードコーディングする代わりに定数で記述しておくと、サーバ環境を移動した場合にもコードを変更する必要がない。

エスケープシーケンス

キーボードから直接表現できない特殊文字。シングルクォーテーションの中では記述されたものがそのまま解釈されるので、必ずダブルクォーテーションで囲まれていなければならない。

文字 概要
¥r 復帰
¥n 改行
¥t タブ
¥$ ドル記号
¥¥ 円記号/バックスラッシュ
¥" ダブルクォーテーション

演算子

代数演算子

演算子 概要 例
+ ふたつの数値の和 $x + $y
- ふたつの数値の差 $x - $y
* ふたつの数値の積 $x * $y
/ ふたつの数値の商 $x / $y
% ふたつの数値の割り算を行い、その余り $x % $y
++ 前置加算(代入後に加算) $i++
++ 後置加算(代入前に加算) ++$i
-- 前置減算(代入後に減算) $i--
-- 後置減算(代入前に減算) --$i

++と--は指定された変数の値を増減するための演算子で、インクリメント(加算子)やデクリメント(減算子)とも言う。例えば次の2つの式は意味的に等価。

$x=$X+1;
$x++;

前置演算と後置演算は、加算(減算)した結果を代入してから値を返すか、値を返してから加算(減算)を行うかという点で異なる。

<?php
$x=1;
print ($x++.'<br />');
print ($x.'<br />');
print (++$x.'<br />');
print ($x.'<br />');
?>

1 2 3 3

代入演算子

変数への代入を行うための演算子。代入演算子には、代数演算子と合わせた機能を提供する複合代入演算子も含まれる。

演算子 概要 用例
= 値を変数などに代入する $x=10
+= 左辺の値に右辺の値を加えたものを、左辺に代入する $x+=10、$x=$x+10
-= 左辺の値から右辺の値を引いたものを、左辺に代入する $x-=10、$x=$x-10
*= 左辺の値に右辺の値を掛けたものを、左辺に代入する $x*=10、$x=$x*10
/= 左辺の値を右辺の値で割ったものを、左辺に代入する $x/=10、$x=$x/10
%= 左辺の値を右辺の値を割った余りを、左辺に代入する $x%=10、$x=$x%10
.= 左辺の値に右辺の値を連結した文字列を、左辺に代入する $x.="A"、$x=$x."A"

比較演算子

左辺と右辺の値を比較し、評価結果をTRUE/FALSEで返す。if、while、do...while命令の条件式で使用する。

演算子 概要 例
== 左辺と右辺が等しい場合にTRUEを返す $x==1
=== 左辺と右辺が等しく、かつ同じデータ型の場合にTRUEを返す

$flag===TRUE

!= 左辺と右辺が等しくない場合にTRUEを返す $x!=10
!== 左辺と右辺が等しくない、または同じデータ型でない場合にTRUEを返す $flag!==TRUE
< 左辺が右辺より小さい場合にTRUEを返す $x<10
> 左辺が右辺より大きい場合にTRUEを返す $x>10
<= 左辺が右辺以下のときにTRUEを返す $x<=10
>= 左辺が右辺以上のときにTRUEを返す $x>=10
? (条件式)?(式1):(式2) 条件式がTRUEの場合は式1、FALSEの場合は式2を返す $x>10 ? "OK" : "NG"

?演算子は三項演算子とも呼ばれ、指定された条件式の真偽に応じて異なる式(値)を出力したい場合などに使用する。

論理演算子

複数の条件式を論理的に結合するための演算子。前項の比較演算子と組み合わせて使用するのが一般的。

演算子 概要 例
&&(and)

左式/右式と双方がTRUEの場合にTRUEを返す

$x==10 && $z==100
||(or) 左式/右式といずれかがTRUEの場合にTRUEを返す $x==1 || $x==2
xor 左式/右式いずれかがTRUEで、かつ双方ともTRUEではない場合にTRUEを返す $x==10 xor $x==100
!

式がFALSEである場合にTRUEを返す

!$flag

AND演算子(&とand)とOR演算子(||とor)がそれぞれ2つ用意されているのは、評価される際の優先順位が異なるため。

ビット演算子

ビット単位(整数を2進法で表したときの各桁)で論理演算を行うための演算子。

演算子 概要 例
& 左式/右式の双方でセットされているビットをセットする 10&1 → 1010&0001 → 0000 → 0
| 左式/右式のいずれかでセットされているビットをセットする 10|1 → 1010|0001 → 1011 → 11
^ 左式/右式のいずれかでセットされており、かつ、双方にセットされていないビットをセットする 10^1 → 1010^0001 → 1011 → 11
~ ビットを反転させる ~10 → ~1010 → 0101 → -11
<< ビットを左にシフトする 10<<1 → 1010<<1 → 10100 → 20
>> ビットを右にシフトする 10>>1 → 1010>>1 → 0101 → 5

その他の演算子

演算子 概要 例
. 文字列連結。左式と右式を連結する $memo.$title
@ 式の先頭に指定することでエラーメッセージを非表示にする @fopen("sample.dat")
` バッククォート(`)で囲んだブロックをシステムコマンドとして実行 `dir`

@演算子はエラー演算子とも言い、特定の命令の先頭に付加することで、その命令で発生したエラーメッセージの出力を抑制する。

<?php
print(1/0);
?>

Warming: Division by zero in ~atmark.php on line 2

除算を0で行うことは許されていないので警告メッセージが表示されるが、print命令の先頭に@演算子をつけることで、警告メッセージが抑制され、表示されなくなる。

<?php
@print(1/0);
?>

演算子の優先順位

優先順位 演算子
1 new
2 [
3 ! ~ ++ -- (int) (double) (string) (array) (object) @
4 * / %
5 + - .
6 << >>
7 < <= > >=
8 == != === !==
9 &
10 ^
11 |
12 &&
13 ||
14 ? :
15 = += -= *= /= .= %= &= |= ^= ~= <<= >>=
16 print
17 and
18 xor
19 or
20 ,

条件分岐

if命令

if命令はもしも〜だったら...さもなければ...という構文を作成する。

<?php
$x=10;
if ($x==10) {
 print ('変数$xは10です。')
} else {
 print ('変数$xは10ではありません。')
}
?>

変数$xは10です。

指定された条件式がTRUEの場合に条件式直後のブロックを、FALSEの場合にelse直後のブロックをそれぞれ実行する。

また、elsifブロックを使用することで、複数の分岐を表現することも可能。

<?php
$x=15;
if ($x>20) {
 print ('変数$xは20より大きいです。');
} elsif ($x>10) {
 print ('変数$xは10より大きく、20以下です。');
} else {
 print ('変数$xは10以下です。');
}
?>

変数$xは10より大きく、20以下です。

条件1を満たし、かつ条件2がTRUEであるかどうかによって処理を分岐させる場合にはif命令をネスト構造にする。

<?php
$x=1;
$y=0;
if ($x==1) {
 if ($y==1) {
  print ('変数$x、$yは1です。');
 } else {
  print ('変数$xは1です。$yは1ではありません。');
 }
} else {
 print ('変数$xは1ではありません。');
}
?>

変数$xは1です。$yは1ではありません。

switch命令

if命令ではせいぜい3分岐(できれば2分岐)程度の単純分岐にとどめ、多岐分岐を表現する場合にはswitch命令を使用する。

<?php
$rank='甲';
switch ($rank) {
 case '甲' :
  print ('大変良いです。');
  break;
 case '乙' :
  print ('良いです。');
  break;
 case '丙' :
  print ('もう少しがんばりましょう。');
  break;
 default :
  print ('???');
  break;
}
?>

大変良いです。

それぞれのcaseブロックには複数の命令を指定できるが、必ず最後にbreak命令でswitchブロック全体を明示的に脱出しなければならない。defaultブロックは、caseブロックに合致するものが無かった場合に実行されるブロック。defaultブロックの記述は任意だが、意図しない値が入力(指定)された場合の処理を曖昧にしないためにも、きちんと明示しておく。

繰り返し処理

for命令

あらかじめ指定された回数だけ繰り返し処理を行うための命令。

<?php
for ($i=1; $i<6; $i++) {
 print ("$i 番目のグループです。<br />");
}
?>

1 番目のグループです。 2 番目のグループです。 3 番目のグループです。 4 番目のグループです。 5 番目のグループです。

最初の式($i=1)で初期値をセットする。 2番目の式($i<6)はループの継続条件を示す。 3番目の式($i++)はループが1回終了するたびに実行される増減式。

while命令とdo...while命令

あらかじめ繰り返し回数が決まっている場合に便利なfor命令に対して、何かしらループ内の特定の条件に基づいてループの終了を制御したい場合に使用する。

while命令

");
 $i++;
}
?>

do...while命令

<?php
$i=1;
do {
 print ("$i 番目のループです。<br />");
 $i++;
} while ($i<6);
?>

while命令は前置判断(ループの最初で条件判断を行う)、do...while命令は後置判断(ループの最後で条件判断を行う)。前置判断と後置判断では、ループが始まる前にすでに条件式がFALSEである場合に挙動の違いとして現れてくる。後置判断では必ず1回はループ処理されるが、前置判断では1回もループされない場合がある。

foreach命令

配列(連想配列)配下の各要素に対して繰り返し処理を行う。

<?php
$data=array ('大森'=>'男', '小林'=>'女', '林'=>'男', '森'=>'女');
foreach ($data as $key=>$value) {
 print ("$key : $value <br />");
}
?>

大森 : 男 小林 : 女 林 : 男 森 : 女

break命令とcontinue命令

continue命令

特定の条件下で繰り返しを中断したり、一部の処理をスキップすることが可能になる。 たとえば以下は、1〜10までの偶数値のみを加算するスクリプト。

<?php
$num=0;
for ($i=1; $i<=10; $i++) {
 if ($i%2!=0) { continue; }
 $num+=$i;
}
print ("合計値は $num です。");
?>

合計値は 30 です。

break命令

continue命令は、特定条件を満たしたときにcontinue命令を実行して現在のループをスキップし、次のループを継続して実行できる。

break命令は、特定条件を満たしたタイミングでループを脱出する。以下は、1〜100までの値を加算し、合計値が100を越えたときのループ変数を出力する。

<?php
$num=9;
for ($i=1;$i<=100;$i++) {
 if ($num > 100) { break }
 $num+=$i;
}
print ('合計が100を越えるのは1 〜' .--$i.' までを加算したときです。');
?>

合計が100を越えるのは1 〜14までを加算したときです。

関数

関数とは、与えられた入力に基づいてなにかしらの結果を返す命令のことを言う。この入力のことを引数、出力のことを戻り値と呼ぶ。関数の基本的な構文は以下。

[戻り値=] 関数名 ([引数1,引数2,...])

引数が2つ以上存在する場合には、カンマ区切りで記述する。引数が存在しない場合での関数名の後のカッコは省略できない。また、関数によっては処理を行うのみで戻り値を持たないものがある。

PHPマニュアルにおける、基本的な構文表記の読み方

void asort (array array [,int sort_flags])
戻り値のデータ型 関数名 (引数のデータ型 仮引数 [,引数のデータ型 仮引数])

引数のデータ型には次のようなものがある

データ型 概要
array 配列型
bool 真偽型(TRUE | FALSE)
float 浮動小数点型
int 整数型
mixed 複数のデータ型を返す可能性がある(戻り値のみ)
object オブジェクト型
resource リソース型
string 文字列型
void 戻り値がない(戻り値のみ)

関数が戻り値を返さない場合、戻り値のデータ型はvoidと表記される。また、関数によっては、たとえば処理に成功した場合はresouce型を、失敗した場合はFALSEを返すようなものがある。このような関数の戻り値はmixed(混合型)と表記される。

ユーザ定義関数

あらかじめ用意されている関数ではなく、自前の関数。

下記はユーザ定義関数の例。showString関数は、与えられた文字列($value)を$num回繰り返す。その歳、$delimで指定された値を文字列の区切り文字として使用する。

<?php
function showString ($value, $num, $delim) {
 for ($i=1;$i<=$num;$i++) {
  print ($value.$delim);
 }
}
showString ('だるまさんが転んだ!',5,'<br/>');
?>

だるまさんが転んだ! だるまさんが転んだ! だるまさんが転んだ! だるまさんが転んだ! だるまさんが転んだ!

ユーザ定義関数を定義するには、function命令を使用する。function命令の一般的な構文は以下。

function 関数名 (仮引数1,仮引数2,...) {
 ...任意の処理...
  [return 戻り値;]
}

仮引数とは、ユーザ定義関数の処理内で参照可能な変数のこと。後からユーザ定義関数を利用する場合、外部の情報をユーザ定義関数に引き渡す際に使用する。ユーザ定義関数の引数を定義するための情報。

省略可能な引数を設定したい場合には、次のように仮引数の後方にデフォルト値を明記する。これによって、引数が省略された場合には、指定されたデフォルト値が使用される。

<?php
function showString ($value, $num, $delim='<br />') {
 for ($i=1;$i<=$num;$i++) {
  print ($value.delim);
 }
}
showString ('だるまさんが転んだ!',5);
?>

ただし、省略可能な引数は、必ず必須である引数の後方に配置するようにする。たとえば次のような記述は不可。

function showString ($value, $delim='<br />', $num) {</code></pre></p>
<p>ユーザ定義関数が戻り値を持つ場合は、return命令を使用して処理結果を呼び出し元に返す。return命令が記述されなかった場合、ユーザ定義関数は戻り値を返さない。</p>
<h3>関数の有効範囲</h3>
<p><pre><code><?php
$x=1;
function sample() {
 $x++;
 return $x;
}
print (sample());
?>

1

関数内の変数をローカル変数、関数外の変数をグローバル変数と呼ぶ。 上の例では、最初に初期化された$xはグローバル変数で、次にユーザ定義関数の中で定義された$x(ローカル変数)とは全くの別物。

グローバル変数を強制的にローカル変数として利用したい場合には、globalキーワードを使用する。

<?php
$x=1;
function sample() {
 global $x;
 $x++;
 return $x;
}
print (sample());
?>

2

外部ファイルのインクルード

ユーザ定義関数はその性質上、特定のスクリプトでだけ利用するよりも、複数のスクリプトで共有することが多い。外部ファイルとして保存しておき、必要に応じてインクルード(取り込む)のが好ましいアプローチ。 外部ファイルをインクルードするには、include_once命令またはrequire_once命令を使用する。

included.php

<?php
function showString ($value, $num, $delim) {
 for ($i=1;$i<=$num;$i++) {
 print ($value.$delim);
 }
}
?>

include.php

<?php
include_once ('included.php');
showString ('だるまさんが転んだ!',5,'<br />');
?>

require.php

<?php
require_once ('included.php');
showString ('だるまさんが転んだ!',5,'<br />');
?>

外部ファイルが存在しなかった場合、include_once関数は警告を発するだけだが、require_once関数はエラーとし、スクリプトの実行を中断する。

外部リンク