/bonvhp/webapp2/PHP       [後へ]   [目次へ]   [次へ] ~ [] ~

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 'yy $str zz'; は、yy $str zz と、そのまま表示されます。 ・"\n" は、改行文字1文字になります。 また、 $str = 'ABC'; echo "yy $str zz"; は、yy ABC zz と $str が展開されて表示されます。 ただし、 $str = 'ABC'; echo "yy$strzz"; は、yy としか表示されません。 これは、 $str と、後続の zz の間に空白が無いせいで、 $strzz までが変数名だと解釈されます。 変数 $strzz は初期化していないので、 結局、空文字に変換されるからです。 変数名と文字列の間に空白を入れたくない場合は、 変数名を { と } で囲みます。 $str = 'ABC'; echo "yy{$str}zz"; とすれば、yyABCzz と表示されます。
このあたりの変換ルールは、
慣れていてもミスしやすいので、
面倒でも、文字列連結の演算子 . (ドット) を使って、
echo "yy" . $str . "zz";
としたほうが確実かもしれません。
こうすれば
echo 'yy' . $str . 'zz';
と、周りでシングルクオートを使っても同じ結果が得られます。

真偽値

$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 を習慣としています。
/bonvhp/webapp2/PHP       [後へ]   [目次へ]   [次へ]