/bonvhp/webapp/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 '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 と表示されます。

このあたりの変換ルールは、
慣れていてもミスしやすいので、
面倒でも、文字列連結の演算子 . (ドット) を使って、
echo "zz" . $str . "zz";
としたほうが確実でしょう。
こうすれば
echo 'zz' . $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/webapp/PHP       [後へ]   [目次へ]   [次へ]