多くのプログラミング言語同様に、PHPでも、定数、変数を使うことが出来る。
定数、変数とは、「初心者による初心者のためのPHP講座 第3回 文字列」で学んだ文字列などの値を格納しておく箱のようなもので、命令文の中などで箱から値を取り出して使うことが出来る。
定数
定数とは変わることない不変の値、不変の値を格納する箱を指し、define()関数を使って以下のように定義する。
define("定数名", 値);
定数名には、アルファベット、数字、アンダースコアを使うことが出来るが、最初の1文字はアルファベットかアンダースコアである必要がある。
また、特別な引数を設定しない限り、アルファベットの大文字と小文字は区別され、別のものとして扱われる。
定義した定数に格納された値は、定数名で取り出すことが出来る。
難しいことを考えるよりも、実際にサンプルを見たほうが理解が早いだろう。
以下のサンプルでは、echo()関数と組み合わせて定数を使用している。
<!doctype html> <?php echo '<?xml version="1.0" encoding="utf-8"?>'; ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>定数</title> </head> <body> <?php define("VALUE1", 100); define("VALUE2", "100"); define("VALUE3", "こんにちは"); echo VALUE1."<br />"; echo VALUE2."<br />"; echo VALUE3."<br />"; echo VALUE1."円"."<br />"; echo VALUE3."。 この商品は".VALUE1."円です。"; ?> </body> </html>
定数に文字列を格納する場合は、前回学んだ通り「”」や「’」で囲む必要がある。
数値を格納する場合は、「”」や「’」で囲む必要はないが、文字列として数字を扱う場合は、「”」や「’」で囲む必要がある。
例えば「”1″」と「1」は、それぞれ文字列と数値であり、プログラミング上では、本来は別物であり、区別されるべきものだが、PHPでも区別はあるものの、その区別が曖昧である。
この事は、変数の説明の際に再度述べる。
定数は、何度でも呼び出して使用することができ、一度、定数を定義してしまえば、後は定数として呼び出すだけで良いので、都度、値を記述するより遥かに楽であるし、ミスも起こりにくくなる。
実際、上記のサンプルでも定数「VALUE1」、「VALUE3」は、2度以上使われている。
文字列の連結同様に「.」を使って、定数や文字列と連結することも出来る。
定数は、不変の値を考えるよりも、一度定義したら変更が効かない値と考えたほうが分かりやすいかもしれない。
つまり、箱の中身を取り出すことは出来ても、入れ替えることは出来ない。
定義した後で値を変更する必要がなく、繰り返し使う可能性がある値は、定数として定義すると良いだろう。
変数
変数とは、変化する可能性がある値を格納する箱のようなものである。
定数が、一度定義したら値の変更が出来ないのに対して、変数は、何度でも値を変更することが許されている。
つまり、箱の中身を自由に入れ替えることが出来る。
変数の定義は、定数と異なり関数を使う必要がなく、非常にシンプルである。
$変数名; $変数名 = 値;
「$」が変数であることを表し、空の変数を定義するなら単に「$変数名」と宣言すれば良いし、何かしらの値を代入した変数を定義するなら「代入演算子」である「=」を使って値を代入した形で変数を定義すれば良い。
値の代入の有無は別として、この要領で変数を宣言をした時点で変数は初期化され、値が格納される。(値を代入していない場合は、空の値が格納される。)
このあたりは、数学の代入と要領は同じである。
変数名には、アルファベット、数字、アンダースコアを使うことが出来るが、最初の1文字はアルファベットかアンダースコアである必要がある。
また、アルファベットの大文字と小文字は区別され、別のものとして扱われる。
「$$value」のように変数名に変数を使う使うことも出来るが、ここでは説明を省く。
では実際にサンプルを見てみよう。
<!doctype html> <?php echo '<?xml version="1.0" encoding="utf-8"?>'; ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>定数</title> </head> <body> <?php $value; $price = 2000; $birthday = "19970903"; $comment = "こんにちは。"; define("VALUE1", "おはよう。"); echo "値は「".$value."」です。<br />"; echo $price."<br />"; echo $birthday."<br />"; echo $comment."<br />"; echo $comment." この商品は".$price."円です。<br />"; echo VALUE1." この商品は".$price."円です。<br />"; $value = "ありがとう"; echo "値は「".$value."」です。"; ?> </body> </html>
定数同様に、文字列と数値の区別があり、文字列を変数に代入する場合は、「”」や「’」を使う必要がある。
「.」を使って文字列や定数と連結することも出来る。
変数「$value」をecho()関数でブラウザに表示した結果が、16行目と23行目では異なっているが、16行目の時点では、$valueは空であり、22行目で初めて文字列を格納しているためである。
このように変数に格納された値は、再度、値を代入する形で容易に変更できる。
値の代入の応用
変数に変数を代入したり、関数の戻り値を代入することも可能である。
<?php $today = date("Y/m/d"); $message = "今日は".$today."です。"; ?>
このサンプルでは、 date()関数の戻り値、つまりは現在の日付を変数「$today」に代入している。
更に変数「$today」は、変数「$message」に代入されている。
代入演算子「=」以外にも、「+=」、「 -=」、「*=」、「/=」、「%=」、「.=」と言った代入演算子を使用することができる。
<!doctype html> <?php echo '<?xml version="1.0" encoding="utf-8"?>'; ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>様々な代入演算子</title> </head> <body> <?php $num1 = 8; $num1 += 5; $num2 = 1000; $num2 -= 500; $num3 = 3; $num3 *= 4; $num4 = 21; $num4 /= 7; $num5 = 17; $num5 %= 5; $str1 = "鈴木"; $str1 .= "さん"; echo $num1."<br />"; echo $num2."<br />"; echo $num3."<br />"; echo $num4."<br />"; echo $num5."<br />"; echo $str1; ?> </body> </html>
上記のサンプルで使われている演算子のうち「.」は、文字列、定数、変数の連結で学んでいるが、その他は、下記のとおりである。
- + ・・・足し算
- - ・・・引き算
- * ・・・掛け算
- / ・・・割り算
- % ・・・割り算の余りを求める
上記のサンプルは、下記と同じ意味であり、下記のような記述の方が理解しやすいだろう。
<!doctype html> <?php echo '<?xml version="1.0" encoding="utf-8"?>'; ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>様々な代入演算子</title> </head> <body> <?php $num1 = 8; $num1 = $num1 + 5; $num2 = 1000; $num2 = $num2 - 500; $num3 = 3; $num3 = $num3 * 4; $num4 = 21; $num4 = $num4 / 7; $num5 = 17; $num5 = $num5 % 5; $str1 = "鈴木"; $str1 = $str1."さん"; echo $num1."<br />"; echo $num2."<br />"; echo $num3."<br />"; echo $num4."<br />"; echo $num5."<br />"; echo $str1; ?> </body> </html>
定義済み変数
PHPでは、予め定義された変数がある。
つまり、自分で値を代入する必要がなく、何もしなくとも予め値が格納されており、自由に値を取り出して使うことが出来る変数である。
「$_SERVER」、「$_GET」、「$_POST」、「$_COOKIE」などがそうであるが、これらについては、実際に使う機会に詳しく説明する。
これらは「スコープ」を無視して使えることから、「スーパーグローバル変数」と呼ばれている。
※「スコープ」については別の機会に説明する。
参照渡し
次のサンプルでは$aと$bは実質的に同じ意味を持つ。
つまりどちらの値は「100」である。
<?php $a = 100; $b = $a; ?>
では、次のプログラムの実行結果はどうなるだろうか?
<?php $a = 100; $b = $a; $a = 200; echo $b; ?>
「100」と表示されるという予想と「200」と表示される予想の2つの予想が成り立つのではないかと思うが、答えは「100」である。
$aとSbは、値こそ同じかもしれないが、全く別の変数であり、$bが定義された時点で「100」が代入されており、$bを定義し直さない限り、$bの値を変えることは出来ない。
では、次のサンプルの結果はどうなるだろうか?
<?php $a = 100; $b = &$a; $a = 200; echo $b; ?>
答えは「200」である。
3行目の$bに$aを代入する式で「$a」の前に「&」を付けて「&$a」としているが、こうすることによって、後に$aの値が変わった際に、$bにも反映されるようになる。
これを「参照渡し」と呼ぶ。
変数の型
ここまでの説明から、変数の値には、文字列と数値があることに気づいたと思うが、実際、様々な種類の値を変数に格納することが出来る。
変数に代入される値の種類を「変数の型」と呼び、プログラミング上では、型の違いを意識する必要がある。
しかし、PHPも例外ではないが、PHPにおいては「変数の型」の区別が曖昧である。
以下、主な「変数の型」をまとめる。
文字列
文字列は、「初心者による初心者のためのPHP講座 第3回 文字列」で説明した通りである。
$my_string = "おはよう";
整数
数値の一種で、小数点を持たないもの。
PHPでは、-2,147,483,648 から 2,147,483,647 までの整数値を扱うことが出来る。
$my_integer = 1000;
浮動小数点
小数点を持つ数値。14桁まで扱うことが出来る。
$my_float = 3.1415;
論理値
格納できる値は、trueまたはfalseのみで、それぞれ「正しい」、「誤り」を表すと考えると理解しやすいかもしれない。
プログラミング上では「真偽」という。
この型は、ある事柄に関して、それが正しいか、誤りかを判定する際に使われる。
例えば、特定の条件の満たすなら「true」を格納し、そうでない場合は「false」を格納しておいて、後の処理でその値を判別に利用する。
$my_boolean = true; $my_boolean = false;
文字列の「”true”」や「”false”」とは本質的に意味が異なり、「”」を必要としないことからも分かるように文字列として値が格納されているわけではなく、この型の変数をecho()関数で表示すると、値が「true」の場合は、「1」が表示され、値が「false」の場合は、何も表示されない。
真偽の判定ではあるが、echo()関数で「true」、「false」と表示させたいなど、文字列とし再利用する必要がある場合は、以下のように最初から文字列として定義したほうが良い場合もある。
$my_boolean = "true"; $my_boolean = "false";
しかし、似て非なるものであり、上記の例の型は「文字列」であり、もはや「論理値」ではない。
配列、連想配列
区切り文字で区切られたリスト状の値、階層構造を持つリストのような複雑なデータを変数に格納に、容易に処理が出来る点もPHPの特徴である。
「配列」、「連想配列」については、別の機会に詳しく述べる。
$my_array = array( "鈴木さん" => array('男', '20'), "田中さん" => array('女', '68'), "山田さん" => array('男', '45'), );
オブジェクト
「class」を使った「オブジェクト指向プログラミング」を行う際に使用するが、本講座でのサンプルプログラムは、「オブジェクト指向」ではないので、ここでは説明を省く。
NULL
NULL型とは、値として何も格納されていない空の状態である。
「NULL」が代入されている場合の他、何も代入されていない場合もNULL型となる。
<?php $my_null = NULL; $my_null; ?>
その他の型
「リソース」、「ストリーム」と言った特殊な型も存在するが、これらは特定の処理の際に使うものである。
型の区別の実際
PHPは、型の区別が非常に曖昧なプログラミング言語であり、そのため型の区別をあまり意識する必要がないので、PHPが「易しい言語」である理由の1つになっているかもしれない。
但し、これがプログラマーに優しいか否かは別問題ではあると思うが・・・。
次の例は、演算子「+」を使って、数学上の足し算を行なっている。
<?php $a = 100; $b = "50"; echo $a + $b; ?>
$aは整数、$bは文字列であり、型を厳密に区別するなら、整数と文字列の足し算など成立しないが、実際には「150」と表示される。
次のサンプルでは、$cに代入する際に足し算を行い、gettype()関数で、$cの型を取得し、echo()関数で表示している。
<?php $a = 100; $b = "50"; $c = $a + $b; echo gettype($c); ?>
結果は「integer」、つまり整数となる。
整数と文字列の足し算の結果が、自動的に整数型になっている。
PHPでは、変数が柔軟に処理される反面、「100」と「”100″」の区別が難しくなっている側面もある。
未定義の変数
次のサンプルは、一文字ずつ、よく見て欲しい。単純なタイプミスがある。
<?php $my_string = "おはよう"; echo $ny_string; ?>
このサンプルのecho()関数は、未定義の変数「$ny_string」を引数として使おうとしている事になるが、これは「エラー」にはならない。
設定ファイル「php.ini」の設定によっては、「Notice: Undefined variable」と言う「注意」が表示される場合もあるが、これはエラーではないため、処理は継続される。
PHPでは、未定義の変数を使おうとした場合、自動的にNULL型の変数として定義されるようである。
よって、このサンプルは、NULL型の$ny_stringを表示することになるので、結果として何も表示れない。
この場合、処理結果が意図した結果と異なるので、エラーとして表示されなくとも誤りがあることは明確であるが、処理の仕方によっては正常に動作しているように見えることもあるので厄介である。
ともかく、自動定義されるからと言って、変数を未定義のまま使用する事は避けた方が良い。
私も同様のミスをした経験があり、ユーザーから「注意」が表示されることを指摘されて、ようやく、未定義の変数の扱いについて気づいた。
NULL型の変数として自動的に定義される点も、私の処理には都合が良く、処理結果から、この誤りに気づくことが出来なかった。
Pingback: 初心者による初心者のためのPHP講座 第5回 演算子 | モノについてのモノ語り