PHPの基礎文法をおさらいする(変数・型・スコープ・配列)
ソースコードをHTML文書内に埋め込む場合
ここでいうPHPとはインタプリタ方式のスプリクト言語を指している。PHPのソースコードは、HTML文書の中に<?php
と?>
という区切り文字(スクリプティングデリミタと呼ぶ)を埋め込んで、その間に記述することができる。
<html>
<head>
<title>PHPはHTML埋め込み言語</title>
</head>
<body>
<?php
print "Hello, world!";
?>
</body>
</html>
<?php
と?>
で囲まれた領域をPHPブロックと呼ぶ。
PHPのソースコードを含むファイルの拡張子は、ウェブサーバの一般的な設定では、.phpとすることになっている。
ソースコードをHTML文章内に埋め込まない場合
ライブラリにするにはもちろんファイルにPHPだけを記述することになる。その場合は終了の区切りを示す?>
を省略することが推奨されている。PHPだけを記述したファイルでは?>
を使わないほうがよい。
<?php
print "Hello, world!\n";
これをhello.phpというファイル名で保存した場合、ターミナルエミュレータ上で次のように実行することができる。
$ php hello.php
Hello, world!
ソースコード中にコメントを記す場合
PHPブロック内にコメント行を設けたい場合は、コメントの先頭に//
か#
を付ける。これ以降、行末までがコメントと認識される。複数行にわたってコメントを記したいときには/*
と*/
とでコメントを挟む。
<?php
// この行が改行までコメント
# この行も改行までコメント
/* ここからコメントがはじまる
ここで終わる */
一つの式の終わりにはコロンが必要
PHPは、RubyやPerlと異なり、改行コードを式の終わりとして認識しない。複数行に渡るコードの記述は、コロンがないかぎり一つの式の単位として認識されてしまう。したがって改行を無視するので、式の終了を示すためにはコロン;
を入力しなければならない。
<?php
$a1 = "PHP";
echo "これは{$a1}のソースコードです", PHP_EOL;
ちなみにPHP_EOL
は改行コードが収められた定数で、#define
によってphp.hという名のヘッダファイルの中で定義されている。しかも#ifdef
文を使って定義されているので、プラットフォームごとに\r\n
か\r
か\n
かを自動的に判断してくれる便利なもの。
変数の名前のつけ方
PHPでは多くのスプリクト言語と同じく変数の宣言が不要。変数の名前は$
記号によって始まる。変数名には忘れたころに再び読んでも意味が分かる変数名をつけるべきだが、長すぎても短すぎても不都合を生じる。意味が分からなくなるほどの極端な省略は避けるべきだと広く考えられている。
変数名をつける際の義務となるルールは次のとおり。
- 変数名の先頭文字は
$
でなければならない。つまり$
が変数名であることを表わす標識になる。 - 大文字と小文字を区別する。したがって
$hensu
と$Hensu
は同じ変数ではない。 $
の次の文字は英字かアンダースコア(_
)かでなければならない。したがって$1hensu
は誤り。$
の次の次の文字も、英字か数字かアンダースコアかでなければならない。
ただし命令文においては大文字と小文字の区別をしない。Print
でもprint
でもPRINT
でもpRint
でも同じ意味になる。
変数に入れる値のデータタイプ
PHPで使える変数のデータタイプには次のものがある。
- 整数を扱うinteger, int
- 浮動小数点を扱うdouble, float, real
- 文字列を扱うstring
- 真偽を扱うboolean
- 外部リソースを参照するresource
C言語やJAVAなどと違い、PHPでは変数名とデータタイプを予め宣言しておく手続きは不要。したがって、$
をこれらのタイプのデータを先頭につけた変数名に直接代入することによって、変数をすぐに利用することができる。代入を意味する演算子(代入演算子)はC言語やJava言語と同じく=
を使う。
<?php
// 値を変数に代入
$nenrei = 25;
// 標準出力
print $nenrei.PHP_EOL;
式の終わりには式の区切りを示すコロン;
が必要なことに注意する。この点はRubyと異なる。PHP_EOL
は改行を表している。HTML文書の中で表示する場合には改行に<br>
を使う。
文字列の代入では文字列をシングルクォーテーション(すなわち'
)かダブルクォーテーション(すなわち"
)で囲む。この文字列には変数名やエスケープシーケンスを含めることができるが、変数名やエスケープシーケンスを文字通りに表示させるにはシングルクォーテーションを使い、変数に格納されている値やエスケープされたものとして表示させるにはダブルクォーテーションを使う。このとき、変数名は{}
で囲む必要がある。
<?php
$str1 = 'PHP';
// シングルクォーテーションを使って文字列を表す
$str2 = '{$str1}です。\n';
// 標準出力
print $str2;
シングルクォーテーションを使った場合の表示結果は次のようになる。変数名やエスケープシーケンスがそのまま表示されてしまうのが分かる。
{$str1}です。\n
<?php
$str1 = 'PHP';
// ダブルクォーテーションを使って文字列を表す
$str2 = "{$str1}です。\n";
// 標準出力
print $str2;
ダブルクォーテーションを使った場合の表示結果は次のようになる。変数は代入した値に置き換えられ、文末で改行されているのが分かる。
PHPです。
変数にはヒアドキュメントを格納することもできる。ヒアドキュメントとは、<<<始点ID名(ここではEOT)からはじまって終点ID名;で終わる複数行から成る文字列。
$html_head = <<<EOT
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<title></title>
</head>
<body>
EOT;
$html_foot = <<<EOT
</body>
</html>
EOT;
注意点としては、終点ID名;のためにひとつの独立した行を設けて、かつ、インデントしてはならないことがある。つまり、終点ID名;以外の文字や空白文字がその行に含まれていてはいけない。
データタイプの変換(キャスト)
変数のデータタイプを変換するキャストという機能をPHPも持っている。変数の宣言をしないPHPでは、データタイプを明示するためにキャストを使うことになる。キャストとして利用できるデータタイプには次のものがある。
- 整数へ変換するための
(int), (integer)
- 浮動小数点へ変換するための
(double), (float), (real)
- 文字列へ変換するための
(string)
- 真偽値へ変換するための
(bool), (boolean)
- オブジェクトへ変換するための
(object)
データタイプ名を()
で括ることによって、このキャストという機能を利用できる。
<?php
// 変数に代入
$kazu1 = 12;
$kazu2 = 5;
$shou1 = $kazu1 / $kazu2;
print "商は{$shou1}です。\n";
// キャストを使う
$shou2 = (int)($kazu1 / $kazu2);
print "商は{$shou2}です。\n";
12を5で割ると2.4になるが、int型で式をキャストすることで小数点以下を切り捨てている。
変数の有効範囲(スコープ)
変数はそれが利用できる有効範囲をソースコードの中にもっている。この有効範囲を一般にスコープと呼ぶ。スコープの違いによって変数は次のように二種類に分けられる。
- ローカル変数
- グローバル変数
ただし、この他にもスーパーグローバル変数と呼ばれる特別に定義された変数が存在する。
関数(function
)を定義したブロック内で使われ始めた変数は通常、関数を定義したブロック(function{}
)の中でのみ有効である。よってローカル変数と呼ぶ。これに対して関数のブロック外で使われ始めた変数をグローバル変数と呼ぶ。ローカル変数とグローバル変数は、たとえ変数名がまったく同じであっても別々の変数として識別される。
\ | 関数{}内 | 関数{}外 |
---|---|---|
ローカル変数 | 有効 | 無効 |
グローバル変数 | 無効 | 有効 |
ただし、関数のブロック内からグローバル変数を参照することができる。そのひとつの方法はスーパーグローバル変数である$GLOBALS
を使うこと。
<?php
// グローバル変数
$kazu1 = 5;
$kazu2 = 6;
// 関数の定義
function tashizan(){
// $GLOBALS['']という書式で
$wa = $GLOBALS['kazu1'] + $GLOBALS['kazu2'];
print "和は{$wa}です。\n";
}
// 関数を呼び出す
tashizan();
もうひとつの方法はglobalキーワードを使うこと。
<?php
// グローバル変数
$kazu1 = 5;
$kazu2 = 6;
// 関数の定義
function tashizan(){
// globalキーワード
global $kazu1, $kazu2;
$wa = $kazu1 + $kazu2;
print "和は{$wa}です。\n";
}
// 関数を呼び出す
tashizan();
いずれも和は11になる。
配列
PHPの変数にはスカラー変数と非スカラー変数とがある。スカラー変数はデータを一つの変数に一塊にして区切らずに格納するものだが、配列は複数のデータをそれぞれ区切って並べるように一つの変数に配列構造として格納するもので、非スカラー変数に類別されている。
配列構造のイメージとしては、データベースや表計算ソフトを想起するとよい。一列だけで構成される配列を一次元配列と呼び、表計算ソフトのように縦と横の列を持つ配列を二次元配列、または多次元配列と呼ぶ。
配列を利用するにはarray関数を使用して次のように記述する。
<?php
// 一次元配列の場合
$PersonalName = array('一郎','二郎','三郎','四郎','五郎');
// 二次元配列の場合(入れ子にする)
$Name_Age = array(
array('一郎','30歳'),
array('二郎','25歳'),
array('三郎','20歳'),
array('四郎','15歳'),
array('五郎','10歳'));
// 定義した配列を表示
print_r($PersonalName);
print_r($Name_Age);
PHP5.4以降のバージョンではarray関数の代わりに[]
を使用することができる。
<?php
// 一次元配列の場合
$PersonalName = ['一郎','二郎','三郎','四郎','五郎'];
// 二次元配列の場合(入れ子にする)
$Name_Age = [
['一郎','30歳'],
['二郎','25歳'],
['三郎','20歳'],
['四郎','15歳'],
['五郎','10歳']];
// 定義した配列を表示
print_r($PersonalName);
print_r($Name_Age);
配列要素へのアクセスと識別キー
配列に格納されたそれぞれのデータを要素と呼ぶ。このそれぞれの要素にアクセスするには要素に割り振られたキーを利用する。上記のように何もキーを指定せずに配列を記述した場合には、0から順番に0,1,2,3,...というように数字による識別キーが各要素に自動的に割り振られる。
例えば、print関数の引数として配列の要素を参照させる場合には次のように記述する。
<?php
// 一次元配列を定義
$PersonalName = ['一郎','二郎','三郎','四郎','五郎'];
// 定義した配列の3番目の要素を表示
echo $PersonalName[2].PHP_EOL;
$PersonalName[2]
は、0から数えて2に当たる3番目の要素、つまり'三郎'
を参照している。次の二次元配列で'20歳'
を参照するには次のようにする。
<?php
// 二次元配列を定義
$Name_Age = [
['一郎','30歳'],
['二郎','25歳'],
['三郎','20歳'],
['四郎','15歳'],
['五郎','10歳']];
// 定義した配列の要素'20歳'を表示
print $Name_Age[2][1].PHP_EOL;
左の[2]
が上から数えて3番目の要素を意味し、右の[1]
が左から数えて2番目の要素を意味している。すなわち、'20歳'
を参照していることになる。
配列の要素を識別できるキーを明示的に割り振るには=>
を使って次のように記述する。矢印の左側がキーで矢印の右側が値を意味する。こうした配列を連想配列と呼ぶことがある。
<?php
// 連想配列を定義
$PersonalName = [
1 => '一郎',
2 => '二郎',
3 => '三郎',
4 => '四郎'];
// 定義した配列の2というキーを持つ要素を表示
print $PersonalName[2].PHP_EOL;
この場合、最初のキーの指定以降を省略して記述することができる。
<?php
// 連想配列を定義
$PersonalName = [1 => '一郎', '二郎', '三郎', '四郎'];
// 定義した配列を表示
print_r($PersonalName);
次のように、=>
の代わりに=
で代入するようなやり方で連想配列を作ることもまたできる。
<?php
// 連想配列を定義
$PersonalName['a'] = '一郎';
$PersonalName['b'] = '二郎';
$PersonalName['c'] = '三郎';
$PersonalName['d'] = '四郎';
$PersonalName['e'] = '五郎';
// 定義した配列を表示
print_r($PersonalName);
配列に新たな要素を追加するには次のようにする。
<?php
// 配列を定義
$PersonalName = array('一郎','二郎','三郎','四郎','五郎');
// 定義した配列の末尾に新たな要素を追加
$PersonalName[] = '六郎';
// その配列を表示
print_r($PersonalName);
実行結果は次のようになる。
Array
(
[0] => 一郎
[1] => 二郎
[2] => 三郎
[3] => 四郎
[4] => 五郎
[5] => 六郎
)
配列の要素の値を差し替えることもできる。
<?php
// 配列を定義
$PersonalName = array('りんご','みかん','かき');
// 3番目の要素を'いちご'に置き換える
$PersonalName[2] = 'いちご';
// その配列を表示
print_r($PersonalName);
実行結果は次のようになる。
Array
(
[0] => りんご
[1] => みかん
[2] => いちご
)
配列が要素をいくつ持っているかを整数値で得たいときにはcount関数を使う。
<?php
// 配列を定義
$yasai = ['レタス','キャベツ','ハクサイ'];
// 要素の数を表示
print "count($yasai)個です。\n";
この実行結果は「3個です。」となる。
in_array関数で配列の中の要素の有無を調べることができる。あればTRUEを、なければFALSEを返す。
<?php
// 配列を定義
$fruit = ['avocado','mango','plum','loquat'];
// in_array('要素名',変数名)で調べる
if(in_array('loquat',$fruit)){
print "Found it.\n";
} else {
print "Couldn't find it.\n";
}
これを実行するとFound it.(あったよ)と表示されるはず。
まだまだつづく。
コメント
コメントを投稿