本記事では、PHPで定数定義によく使う、define関数の使い方を紹介していく。
また、定数を定義するconstとの違いも併せて説明していく。
phpのdefine関数とは
phpのdefine関数とは、「定義する」「限定する」といった語源の通り、
定数を定義することができる関数だ。
define('TAX', 1.08);
define関数の使い方
ではdefine関数の使い方を具体的に説明していく。
define関数の書式
define関数の書式は以下の通り。
//define関数の書式
define(定数名, 値 [, 大文字と小文字の区別]);
定数名に利用できる文字は、英数字か_(アンダースコア)で、数字が使えるのは2文字目以降となる。
ただ、定数名は小文字を利用せず、大文字のみで定義するのが一般的だ。
defineで定義した定数の呼び出し方
defineで定義した関数を呼び出す際は、
変数と違い、呼び出す際に$(ダラー)をつけない点に注意が必要だ。
<?php
define('TAX', 1.08); // 消費税
$price = 100;
echo '税込' . $price * TAX . '円'; //ダラーを付けずに呼ぶ呼ぶ
<実行結果>
税込108円
消費税はプログラム中で勝手に20%や30%に書き換えられると大変なので、
ここでは「1.08」と定数で宣言している。
なお、defineで定義した定数はプログラムのどこからでも呼び出すことが可能です。
define関数の、大文字と小文字の取り扱い
define関数の、大文字と小文字の取り扱いは、
PHP7までとPHP8以降で異なるので注意してもらいたい。
それぞれ紹介していく。
PHP7、PHP8で共通のdefineでの大文字と小文字の取り扱い
PHP7までと、PHP8以降で共通のdefineでの大文字と小文字の取り扱いとして、
第二引数まで指定した場合、定数名の大文字と小文字を明確に区別するのがルールとなっている。
例として、大文字で定義した定数を、小文字でコールしてみる。
<?php
define('TEST', 'テスト');
echo test;
<実行結果>
PHP Fatal error: Uncaught Error: Undefined constant "test" in ~
エラーが返され、定数をコールできていないのが分かる。
つまり、大文字で定義した定義した関数は大文字でしか呼び出せないし、小文字で定義した定数は小文字でしか呼び出せないと言うことだ。
PHP7までは、第三引数を指定して大文字小文字の区別の無視が可能
ここからがPHP7までと、PHP8以降での差となる。
PHP7までは、
第三引数にtrueを設定すると、大文字と小文字の区別がなくなり、大文字で宣言した場合でも小文字で呼び出すことが可能になる。
<?php
define('TEST', 'テスト', true);
echo test;
<実行結果>
テスト
これがphp7までのdefine関数の最大の特徴と言えるだろう。
だが、この書き方に関しては、定数の性質上、非推奨とされており、実際にdefine関数の第三引数にtrueを指定する使い方をした人はほとんどいないのではないかと筆者は思う。
※第三引数にfalseを指定すると省略した場合と同じく大文字と小文字が区別される。
PHP8以降は第3引数が廃止
PHP8以降では、
第3引数が廃止され、事実上、大文字小文字の区別は操作できなくなった。
第3引数を指定すると以下のようなエラーが表示される。
Warning: define(): Argument #3 ($case_insensitive) is ignored since declaration of case-insensitive constants is no longer supported
定数をより定数らしく操作できるよう機能が限定された感じだ。
以前から推奨されていた定数本来の使い方に近づいた結果となった。
PHP7まで
第三引数にtrueを指定することで、大文字小文字の区別が可能だった(非推奨)。
PHP8以降
第三引数が廃止され、事実上、大文字小文字の区別がなくなった。
defineで定義した値は書き換えられない
定数は変更しようとしても書き換わらず、
さらに「もう定数宣言されてるよ」といった意味のエラー文が出る。
<?php
define('TAX', 1.08); // 消費税
define('TAX', 1.10); // 消費税を変更
echo TAX;
<実行結果>
Notice: Constant TAX already defined
1.08
defineでは、配列定数を定義することが可能
PHP7以降ではdefineで配列を定義することが可能だ。
配列の定数なので配列定数と呼ばれる。
<?php
define('SAKE', array(
'ウイスキー',
'ビール',
'ワイン'
));
echo '好きなお酒は' . SAKE[1] . 'です';
<実行結果>
好きなお酒はビールです
また、配列だけでなく連想配列も定義することも可能だ。
<?php
define('SAKE', array(
'whisky' => 'ウイスキー',
'beer' => 'ビール',
'wine' => 'ワイン'
));
define関数と、const構文との違い
define関数と同じく、
定数定義できるものにconst構文がある。
const TAX = 1.08;
define関数とconst構文との違いは、
define関数がプログラム内のどこからでも呼び出せるグローバルな定数を宣言できるのに対し、
const構文は宣言したクラス内でしか使えないローカルな定数となっている点だ。
そのため、プログラム全体からアクセスする可能性がある定数については、define関数で定義するようにする。逆にそのクラス内でしか使わないような定数は、const構文を用いたほうがいいだろう。
https://www.php.net/manual/ja/function.define.php
定数とは、
一度宣言するとその後は値の更新ができない値のことを言う。
プログラム中で書き換えられてしまうと困るような情報をdefine関数で宣言することで、思わぬバグを未然に防ぐことができる。また、defineすることによって「この値は定数である」と言うことを明示的に示すことができる。
※逆に値を変えることができるものを変数と呼ぶ。