こんにちは! ライターのmuramatsuです。
今回は変数についての解説です。PHPの勉強を始められた方、変数って完璧に理解できていますか? またある程度勉強されている方は、変数は意外と奥が深いのをご存知ですか?
この記事では、
- 変数とは?
- 変数の宣言と値の代入方法
- 変数を使う方法
- 変数を初期化する方法
- 変数のスコープについて
という基本的な内容から、
- 変わらない値、定数とは?
- listで簡単に配列の要素を変数に代入する方法
- スーパーグローバル変数とは?
の応用的な使い方に関しても、図表もいれて分かりやすく解説していきます。
変数とは
PHPは、例えばログイン後ユーザーの登録している名前を表示させたり、その日の特売商品などを表示させることができたりと、Webページを作る上で欠かすことができません。
ただ違う名前や商品を表示させるのに、毎回Webページのコードを書き換えないといけないのはとても大変ですよね。
そこでPHPでは、毎回変わる名前や商品などの「値」を変数とし、変動する値を変数機能を使って簡単に書き換えることができます。変数とはプログラムを実行するために記述されたソースコード上で、扱われるデータを一時的に値を保存しておく箱のようなものです。
変数はコンピュータのメモリという、データやプログラムを一時的に保存してくれる装置に記憶されます。いくつかあるメモリの1スペース(箱)に値が記憶され、その記憶している場所(箱自体)が変数になるイメージです。
変数は基本的に、プログラミング言語で使用する予約後以外なら、好きな名前を付けて使用することができます。PHPの場合は変数を指定するときは、ドル記号($)のあとに変数名を記述します。
変数の名前の付け方例:
$name1 … 英語と数字
$nameA … 英語と大文字アルファベット
$name_a … 英語とアンダースコア
$_7items … アンダースコアと英数字
$äaa … äのようなアスキーコードとアルファベット
変数名は大文字と小文字が区別されます。有効な変数名としては、文字またはアンダースコア(_)から始まり、任意の英数字を記述します。
ただ、以下のような場合は変数として認められません。
$name-1 … 特殊な文字を入れる
先頭が数値で始まる変数や特殊文字の入った変数は無効になるので注意しましょう。
変数の名前をつけるのはルールに沿って入ればなんでも構いませんが、変数はいくつも作る事ができるため、その変数がなにを指しているのかが一目でわかるような名前がオススメです。例えば、苗字と名前の変数を作るときは、$last_nameや$firstNameなどのようにすると分かりやすいですよね。
変数の宣言と値の代入方法
PHPでは値を代入する前に事前に変数を宣言する必要がありません。C言語やJavaなどの他のプログラミング言語と大きく異なる点です。
変数に値を代入するときはイコール(=)を使いますが、変数と値は等しい(イコール)と言う意味ではなく、変数に値を格納するという意味になります。
変数を宣言して値を代入するには、使用する変数の名前と変数に格納する値を指定して、以下のように記述します。
基本構文:
$変数名 = 値;
変数に値を代入する場合、値の型(数字や文字列などのタイプ)によって書き方が少し異なってきますので、それぞれの書き方を見て行きましょう。
数値型
123などの数字を変数に代入する方法です。数値型の値を代入するには、基本構文と同じ以下のように記述します。
基本構文:
$変数名 = 数値型の値;
数値型を変数に代入したの実際のサンプルプログラムを見てみましょう。
サンプルプログラム:
<?php $num = 100; ?>
変数$numは英語のnumber(数)を略したnumを変数名にして、数字の100を代入しました。
また以下のように、値が代入された変数に別の値を代入することもできます。
<?php $num = 100; $num = 200; ?>
値を代入した変数は、他の数値と演算することもできます。
$num = 100; $res = $num + 200;
文字・文字列型
PHPでは変数に文字や文字列を代入するにはシングルクォーテーション(‘ ‘)またはダブルクォーテーション(” “)で囲んで指定するのが基本です。
文字や文字列は以下のように指定します。
基本構文:
$変数名 = '文字・文字列';
実際のサンプルプログラム
<?php $str1 = 'Samurai '; ?>
文字列演算子を使用して、文字列同士を結合することもできます。
<?php $str1 = 'Samurai '; $str2 = $str1 . 'Engineer'; // Samurai Engineerになります。 ?>
文字列を扱う方法については、以下の記事で詳しく解説していますので、ぜひ参考にしてくださいね!
配列
配列とは、変数と違い複数のデータを格納できる箱のようなものです。イメージとしては以下のように複数の箱が連なって、それぞれの箱に値が格納されています。
基本構文:
$配列名(変数名) = [ '要素1', '要素2', '要素3', '要素4', '要素5' ];
では実際に配列の宣言と値の設定方法について見ていきましょう。以下は1次元配列に値を格納するサンプルです。
サンプルプログラム:
<?php $fruits = [ 'apple', 'orange', 'melon', 'banana', 'paineapple' ]; ?>
以下は値とキー(箱の番号)で成り立つ連想配列に値を格納するサンプルです。
サンプルプログラム:
<?php $fruits = [ 0=>'apple', 1=>'orange', 2=>'apple', 3=>'orange', 4=>'banana' ]; ?>
サンプルプログラムでは、配列や連想配列の要素は文字列でしたが、数値型でも問題ありません。要素が数字の場合はシングル・ダブルクォーテーションは必要ありません。
配列の詳しい使い方については、以下の記事で詳しく解説していますので、ぜひ参考にしてくださいね!
論理型(boolean)
論理型であるbooleanは、真偽の値を指定します。
真偽の値とは定数のTRUE(真)またはFALSE(偽)を指定します。両方とも大文字、小文字に依存はしません。
//値をTRUEに設定する $boo = TRUE;
変数の初期化
変数の初期化とはプログラムの初期処理において、あらかじめ変数に決められた値を設定したり、初期値であることを示すために0やNULLを指定することを言います。PHPでは変数の宣言と値の代入はセットで行いますので、一番始めに変数の宣言と値を代入する処理が初期化処理となります。
PHPでは初期化されていない変数はNULLが格納されているとみなされます。これは以下のように記述した場合と同じです。
$変数 = NULL;
このように$変数にNULLを代入することによって、その変数には値が何も代入されていないと同じ意味となります。
しかしNULLは値が何も入っていないため、NULL設定の変数を参照したり演算で使用するとエラーとなることもありえますので、変数は必ず初めの段階で値を設定しておくことが基本となります。
配列のさまざまな初期化方法については以下の記事で詳しく解説していますので、ぜひ参考にしてくださいね!
変数を使う
さて変数に値を代入した次は、その値を使っていきましょう。
変数の値を出力させる
もっとも簡単で基本的な処理で、変数に代入された値をechoやprintを使って出力します。また配列を出力させるときはprint_rを使って出力させます。
さっそく変数に値を代入して、出力させてみます。
<?php //数値型 $num = 100; echo $num; //改行 echo '<br>'; //文字列 $str1 = 'Samurai '; $str2 = $str1 . 'Engineer'; echo $str1; echo '<br>'; //配列 $fruits = [ 'apple', 'orange', 'melon', 'banana', 'paineapple' ]; print_r($fruits); echo '<br>'; $fruits2 = [ 0=>'apple', 1=>'orange', 2=>'apple', 3=>'orange', 4=>'banana' ]; print_r($fruits2); ?>
実行結果:
100 Samurai Array ( [0] => apple [1] => orange [2] => melon [3] => banana [4] => pineapple ) Array ( [0] => apple [1] => orange [2] => apple [3] => orange [4] => banana )
実行結果を見ると、変数に代入した数値や文字列、配列の通りに出力がされていますね。
もし変数を宣言せずにechoなどで出力する場合など、宣言していない変数を参照しようとすると、以下のようにエラーが発生するので注意しましょう。
Notice: Undefined variable: name in /Applications/XAMPP/xamppfiles/htdocs/testcode7.php on line 3
ここで出てきたechoやprintについて詳しく知りたい方は、下記記事も参考にしてみて下さいね。
値を変更する
変数に代入した値は変更することが可能です。値を変更するには、変更したい変数に違う値を代入するだけでできます。
実際に見てみましょう。
<?php $last_name = '佐藤'; echo $last_name; echo '<br>'; $last_name = '吉田'; echo $last_name; ?>
実行結果:
佐藤 吉田
同じ変数に違う値を代入すると、変数が違う値に変更されているのが分かりますね。もし値を変更したくない場合は、違う変数名を用意しましょう。
文字列と一緒に変数を出力
文字列と変数を一緒に出力するには、出力したい文字列と変数をダブルクォーテーション(“ “)で囲みます。その場合、文字列と変数の間に半角スペースを入れるか、変数を波カッコ({ })で囲みます。
ダブルクォーテーションは変数を展開してくれるので、変数の中に入っている値を出力してくれます。一方シングルクォーテーションで囲んでしまうと、変数は展開されず、そのまま出力されてしまいます。
シングルクォーテーションを使う場合は文字列のみを囲み、変数はそのままで、文字列と変数との間にドット(.)を入れて繋げるこも可能です。
さっそくサンプルプログラムでそれぞれの方法で文字列と変数を一緒に出力してみましょう。
<?php $last_name = '佐藤'; //ダブルクォーテーションで囲った場合 echo "私は $last_name です。<br>"; //ダブルクォーテーションで囲み変数を{ }で囲った場合 echo "私は{$last_name}です。<br>"; $last_name = '吉田'; //シングルクォーテーションで囲った場合 echo '私は$last_nameです。<br>'; $last_name = '田中'; //ドットで繋げた場合 echo '私は'. $last_name. 'です。<br>'; ?>
実行結果:
私は 佐藤 です。 私は佐藤です。 私は$last_nameです。 私は田中です。
ダブルクォーテーションで囲った場合は、変数$last_nameに代入されている佐藤が展開されて出力されています。ただ文字列と変数の間に半角スペースを入れないといけないので、実行結果も佐藤の前後に半角スペースが入ってしまっています。
変数を波カッコで囲った場合の実行結果には佐藤の間にスペースは入っていません。シングルクォーテーションで囲った場合は、そのままの変$last_nameが出力されてしまっています。
一方シングルクォーテーションで文字列のみを囲み、ドットで変数と繋げると、うまく実行されているのが分かりますね。
変数のスコープ
変数のスコープとは、変数が使用できる範囲のことを言います。
変数は使える範囲が決まっており、関数の波括弧({ })で囲まれた中で宣言して使用する変数のことをローカル変数、クラスなどで宣言した変数をグローバル変数と言います。またそれぞれの変数がローカルスコープ、グローバルスコープと呼ばれます。
ローカルスコープのサンプル:
<?php function samplefunc() { $name = 'samurai engineer'; echo $name; } samplefunc(); ?>
実行結果:
samurai engineer
プログラムの中で呼ばれた関数samplefunc()の中ではローカル変数$nameが宣言されて値が格納されています。この$nameは関数samplefunc()の中で作られていますので、関数外であるグローバルスコープでは使用することはできません。
たとえば関数呼出し箇所であるsamplefunc()の下に「echo $name;」を記述しても値はNULLとなっています。そのため、グローバルスコープでも変数を参照するためには、グローバルスコープで設定した変数をglobalを指定して参照する必要があります。
グローバルスコープのサンプル:
<?php $name = 'samurai engineer'; function samplefunc(){ //globalを指定して、グローバルスコープの変数を参照する global $name; echo 'ローカルスコープでの参照:'.$name; echo '<br>'; } samplefunc(); echo 'グローバルスコープでの参照:'.$name; ?>
実行結果:
ローカルスコープでの参照:samurai engineer グローバルスコープでの参照:samurai engineer
ローカル、グローバルそれぞれのスコープで変数が参照できることがわかりますね。
ローカルスコープの範囲とグローバルスコープの範囲は以下のようになっています。
グローバルスコープ
<?php
$name = ‘samurai engineer’;
ローカルスコープ
function samplefunc(){
//globalを指定して、グローバルスコープの変数を参照する
global $name;
echo ‘ローカルスコープでの参照:’.$name;
echo ‘<br>’;
}
グローバルスコープ
samplefunc();
echo ‘グローバルスコープでの参照:’.$name;
?>
関数functionの中がローカルスコープの範囲で、その外がグローバルスコープの範囲となります。
かわらない値、定数とは
定数とは一度設定したら、あとから値が変更ができない変数のことを言います。PHPで定数を指定するにはconstを使用する方法とdefineを指定する方法があります。
定数は主に値を変更されたくないときや、あらかじめ値が決まっている既定値やファイルやURLなどを指定するときに使われます。
以下にconstで定数を定義するサンプルを紹介します。constはクラス内で定義する必要があります。
サンプルプログラム:
<?php class ConstClass { //定数を定義する const CONSTSTR = 'samurai engineer'; function showConst(){ echo self::CONSTSTR; } } $Class = new ConstClass(); $Class->showConst(); ?>
実行結果:
samurai engineer
一度constで設定した定数は、あとから値を変更しようとしてもエラーとなります。
そんな定数の詳しい使い方については、以下の記事で詳しく解説していますので、ぜひ参考にしてくださいね!
listで配列の要素を変数に代入する方法
list関数を使うと、配列の各要素の値を変数として順番に格納することができます。list関数は引数に代入したい変数1つまたは複数指定します。
指定した引数は配列の要素番号0から順番に格納されるので、list関数で指定する変数と配列の要素数は一致する必要があります。
サンプルプログラム:
<?php $fruits_array = [ 'apple', 'orange', 'melon' ]; //listの複数変数を配列から代入 list($apple, $orange, $melon) = $fruits_array; echo $apple. ','. $orange. ','. $melon; ?>
実行結果:
apple,orange,melon
配列の要素が変数として格納され、それぞれの変数を出力すると、配列の要素が出てきました。このようにlist関数を使うと、配列から複数の変数になり一気に値を取得することができます。
list関数については、以下の記事でも詳しく解説しています!
スーパーグローバル変数とは
これまでの変数は自分で定義するものでしたが、PHP実行時に自動的に定義され、すべてのスコープで使用することのできるスーパーグローバル変数があります。スーパーグローバル変数には「$_GET」「$_POST」「$_SESSION」など様々なものがあります。
スーパーグローバル変数の$_GETや$_POSTは、以下の記事で詳しく解説していますので、ぜひ参考にしてくださいね!
まとめ
ここではPHPでの変数について、
- 変数とは?
- 変数の宣言と値の代入方法
- 変数を初期化する方法
- 変数が存在するかチェックする方法
- 変数のスコープについて
- listで複数の変数を代入する方法
- 定数とは?
- スーパーグローバル変数とは?
などについて解説しました。変数はプログラミングをする上でもっとも重要な構文となりますので使い方はよく覚えておきましょう!
もし変数の使い方を忘れてしまったら、この記事を思い出してくださいね!