この記事では、PHPにおける変数と定数の扱いについて解説します。
まずざっくり説明すると、どちらも値を入れておくための箱のようなものです。そして、変数は中身の値が可変であり、定数は中身の値が固定です。
基本的にはこれだけなのですが、それぞれに細かいルールや特徴があります。
以下で詳しく解説していこうと思います。
変数
冒頭にも書いたように、変数とは、値を入れておくための箱で、中身が可変になります。
可変というのは、変数にある値が格納されていたとしても、別の値を上書きできるということです。
変数の書き方
まず、変数の書き方から見ていきましょう。書き方は以下のようなルールになります。
- 先頭にドル記号($)を付ける
- 変数名には任意の文字またはアンダースコア(_)を使用できる
- 英字の大文字小文字は区別する
- 先頭に数字を使うことはできない
ちなみに日本語も使うことはできますが、一般的にはあまり使いません。
// OKな変数名
$abc
$ABC123
$_abc
$あいう
// NGな変数名
abc
$0abc
$-abc
変数への値の代入
変数は値を入れておくための箱と言いましたが、ではどのように値を入れるのかというと、以下のように「=」を使って代入します。
$var = 'abc';
ここでは「abc」という文字列を代入しましたが、他にも、数値、配列、オブジェクトなど、様々なデータ型を入れることができます。
また、変数の値は上書き可能で、変数に他の変数を代入することもできます。
$var1 = 'abc'; // 文字列
$var2 = 123; // 数値
$var3 = true; // 論理型
$var4 = NULL; // NULL
$var5 = ['a', 'b', 'c']; // 配列
$var6 = new MyClass(); // オブジェクト
$var1 = 'あいう'; // 変数の上書き
$var7 = $var1; // 他の変数の代入(中身は'あいう')
ちなみに、他の言語では変数の名前と型を最初に宣言する必要があったりしますが、PHPでは宣言は必要ありません。
変数のスコープ
変数を扱う上で覚えておきたいのが、スコープという概念です。
スコープとは、その変数が見える範囲のことです。
ここではひとまずクラスの概念は除外して考えると、基本的には関数の内側か外側かでスコープが変わります。
<?php
$a = 1;
test();
function test()
{
echo $a;
}
上記の例では、何も出力されません。$aに値が格納されているのは関数の外側なので、内側からは見えないということになります。
<?php
test();
echo $a;
function test()
{
$a = 1;
}
逆の理屈で、これも同様になります。関数の内側で値が格納されているので、外側からは見えません。
ただし、PHPでは変数のグローバル宣言ということをすることで、その変数が関数の内側でも外側でも同じように見えるようにする仕組みがあります。
<?php
$a = 1;
test();
echo $a;
function test()
{
global $a;
echo $a;
$a = 2;
}
グローバル宣言するには、関数内で「global 変数名」と書きます。これで関数内と関数外で$aのスコープが共通になるので、この例では1 → 2の順で値が出力されます。
スーパーグローバル
上記で変数のスコープについて解説しましたが、1つ例外があります。
それはスーパーグローバルと呼ばれる変数です。これらはPHPであらかじめ定義されている特別扱いの変数で、「global 変数名」のように宣言しなくても、無条件で関数内で使うことができます。
具体的には、スーパーグローバルには、以下のような変数があります。
- $GLOBALS
- $_SERVER
- $_GET
- $_POST
- $_FILES
- $_COOKIE
- $_SESSION
- $_REQUEST
- $_ENV
これらは特別な意味を持つ変数ですので、自身で使う変数の名前には使わないようにしましょう。
定数
定数も、値を入れておく箱という意味では変数と同じです。変数との違いは、入れた値を後から変更できないという点です。また、書き方も変数とは異なります。
定数の書き方
定数は元々はdefine()という関数を使って定義する方法しかなかったのですが、PHP5.3.0以降では「const 定数名」という書き方もできます。
- 使える文字は変数と同じ、ただし、先頭にドル記号($)は付けない
- define(‘定数名’, ‘値’) という形式で定義する(全バージョン)
- const 定数名 = 値 という形式で定義する(PHP5.3.0以降)
- 慣例的に、定数名には大文字を使う
定数の定義方法
具体例を見てみます。上述した通り、define()かconstを使うのですが、PHPのバージョンによってできることが異なるので、注意が必要です。
// 全バージョンで使用可能
define('CONSTANT1', 1);
echo CONSTANT1;
define('CONSTANT2', CONSTANT1 + 1);
echo CONSTANT2;
// PHP5.3.0以降
const CONSTANT3 = 1;
echo CONSTANT3;
// PHP5.6.0以降
const CONSTANT4 = CONSTANT3 + 1;
echo CONSTANT4;
const CONSTANT5 = array('a', 'b', 'c');
echo CONSTANT5[0]; // 'a'を出力
// PHP7以降
define('CONSTANT6', array('a', 'b', 'c'));
echo CONSTANT6; // 'b'を出力
順に説明すると、まず全バージョンに対応しているdefine()による定義では、固定値または式で値を格納することができます。
PHP5.3.0以降、constを使えるようになりましたが、この時点でまだ式は使えず、固定値の格納しかできません。
PHP5.6.0以降になると、constでも式を使えるようになり、さらに配列も格納できるようになります。ただし、define()で配列を格納することはできません。
PHP7以降、define()でも配列を格納できるようになりました。
詳しくは、公式のマニュアルも参照してみてください。
http://php.net/manual/ja/language.constants.syntax.php
定数のスコープ
定数は変数とは違い、globalの宣言をしなくても、どこからでも参照できます。
<?php
define('CONSTANT', 'abc');
test();
function test()
{
echo CONSTANT;
}
上記で、「abc」が出力されます。
まとめ
変数と定数について、まとめます。
- どちらも値を格納するための箱
- 変数は可変、関数内でのスコープに注意
- 定数は固定、スコープは気にしなくて良い
以上です!