PHP:定数・変数・演算子
●定数
PHP の定数は、define 関数を使用します。
define(定数名, 値);
例えば、
define("MY_NAME", "わたし");
のように使います。
以後、
echo MY_NAME;
と書けば、
echo "わたし";
と書いたのと同様に扱えます。
定数名は、一般的に、
半角英数の大文字とアンダーバーの範囲で表現します。
デフォルトでは、
大文字・小文字を区別します。
一方、
define(定数名, 値, TRUE);
と書くと、
大文字・小文字を区別しなくなります。
●変数
PHP は、変数を $ で始めます。
宣言もありません。
いきなり $a=0; とかできるわけです。
この場合、$a という変数に、0 を代入する、です。
変数に宣言はありませんが、「型」は存在します。
・数値
$num = 123; // 10進数の 123
$num = 1.23; // 10進数の 1.23
$num = 012; // 8進数。10進数で 10
$num = 0x12; // 16進数。10進数で 18
・文字列
ダブルクォーテーション (") か
シングルクォーテーション (') で囲みます。
$str = "123";
$str = '123';
"" で囲んだ文字列の中に、" の文字そのものを書きたい場合は、
\" とします。
' の場合も同様です。
$str = "123\"45";
$str = '123\'45';
\ で始まるものを「エスケープ文字」といいます。
"\n" // 改行
"\t" // タブ
・文字列内の処理 (パース)
PHP では、" と ' は異なる働きを持ちます。
・' は、囲んだ文字列をそのまま表現します。
・" は、エスケープ文字などを処理します。
変数も展開されます。
つまり、
・'\n' は、文字通り「円マーク」と「n」の2文字です。
また、
$str = 'ABC';
echo 'zz $str zz';
は、zz $str zz と、そのまま表示されます。
・"\n" は、改行文字1文字になります。
また、
$str = 'ABC';
echo "zz $str zz";
は、zz ABC zz と $str が展開されて表示されます。
ただし、
$str = 'ABC';
echo "zz$strzz";
は、zz としか表示されません。
これは、
$str と、後続の zz の間に空白が無いせいで、
$strzz までが変数名だと解釈されます。
変数 $strzz は初期化していないので、
結局、空文字に変換されるからです。
変数名と文字列の間に空白を入れたくない場合は、
変数名を { と } で囲みます。
$str = 'ABC';
echo "zz{$str}zz";
とすれば、zzABCzz と表示されます。
・真偽値
$flag = TRUE; // 真
$flag = FALSE; // 偽
・配列
配列も、全く宣言なく使用できます。
変数名の後に、キー名を [ と ] で囲みます。
例えば、$a[0] = 1; のようにします。
まとめて初期化したい場合は、
$a = array(1,2,3); // $a[0]=1, $a[1]=2, $a[2]=3 を作成
などとします。
途中でキーを増やすこともできます。
$a[3] = 123;
途中の要素を削除する事もできます。
例えば、
$a = array(1,2,3); // $a[0]=1, $a[1]=2, $a[2]=3 を作成
unset($a[1]); // $a[1] を削除
echo '<pre>';
var_dump($a); // 変数 $a の中身を表示する
echo '</pre>';
などとできます。
キーが連続している必要はないのです。
2次元以上にする場合は、キー名を階層分だけ列挙します。
$a[3][4] = 123;
# 誤解のないように補足すると、
# この式は、$a[3][4] という1要素に 123 を代入するだけです。
# $a[0][0] とか $a[3][3] などは未使用のままです。
・連想配列
PHP では、キー名に文字列も使えます。
$a['name'] = 'my_name';
のようにします。
まとめて初期化したい場合は、
$a = array('name'=>'my_name', 'country'=>'Japan');
などとします。
# $a['name']='my_name'; $a['country']='Japan'; と同じ。
これを、連想配列と呼びます。
連想配列は、非常に柔軟で、
$a[0] = 'my_name';
$a['name'] = 'my_name';
のように、
数字と文字列のキーを混在させても構いません。
<?php
$a[0] = 'my_name';
$a['name'] = 'my_name';
echo '<pre>';
var_dump($a); // 変数 $a の中身を表示する
echo '</pre>';
?>
と書いたコードを実行してみてください。
変数 $a に、2つの要素が同居している事が分かるでしょう。
・$_POST, $_GET
HTML form から submit された情報は、
POST であれば、$_POST という名前の連想配列に、
GET であれば、$_GET という名前の連想配列に、
それぞれ格納されて、PHP に渡ってきます。
●演算子
C 言語と同様な演算子が使用できます。
が、もっと種類が多いので、詳細はマニュアルで。
・比較での注意
比較では注意が必要です。
演算子 == や != は、
型変換を行った後で比較を行います。
例えば、
数値の 0、null、空文字("") などは同じものと見なされます。
0 と false を「違うもの」と識別したい場合は、
型も比較対象にする演算子 === や !== を使います。
・文字列での演算
PHP では、文字列でさえ演算できます。
"ABC" & "A" とか "a12" && 0xa とかできるのです。
# お勧めしませんが...
・演算子の優先順位
C言語と微妙に異なるので、
マニュアルで確認しながら書くといいでしょう。
文字列で演算が可能なのは、
すごいと言えばすごいのですが、
個人的には苦労する事のほうが多いと思っています。
特に、WEB アプリで数値を扱う場合、
ユーザーが入力した「数値」も
HTML 的には、「文字列」として PHP に渡ってきます。
これを数字のつもりでビット演算しようとしても、
期待した結果は得られません。
$a = 0x123;
echo ($a & 0x3);
と
$a = "0x123";
echo ($a & 0x3);
とは違った結果になります。
こういう場面では、基本的に、型変換が必要です。
簡単なところでは、+0 してしまいます。
$a = "0x123";
echo ($a+0 & 0x3);
文字列を数値に変換する関数 intval もありますが、
こちらは、基数を意識して使う必要があります。
# intval(変換対象の文字列, 基数:省略すると 10)
$a = "0x123";
echo intval($a);
とすると、答えは 0 になります。
期待するところは、
$a = "0x123";
echo intval($a, 16);
でしょう。
+0 の場合は、このような区別は不要です。
処理の途中、PHP の暗黙の型変換によって、
意図していない場所で文字列に変換されてしまうことも
あったりします。
(もちろん、これはコードを書く側のバグなんですが...)
編者は、文字列のビット演算を使うときは、
+0 を習慣としています。
慣れていてもミスしやすいので、
面倒でも、文字列連結の演算子 . (ドット) を使って、
echo "zz" . $str . "zz";
としたほうが確実でしょう。
こうすれば
echo 'zz' . $str . 'zz';
と、周りでシングルクオートを使っても同じ結果が得られます。