PHPの定数の使い方とconstとdefineの違いを紹介します。
結論から書くと、PHPで定数を作る方法はconst NAME = 値;とdefine('NAME', 値);の2つで、どちらも一度決めた値を上書きできない点は同じです。
使い分けは「ファイルの先頭やクラスの中で決め打ちするならconst、if文や関数の中など実行時に条件つきで定義したいならdefine」です。
定義済みかどうかはdefined('NAME')で確認できます。
定数とは
定数を使うと、値が変化しない、変化してほしくない値を「変わらないもの」として明示的に固定できます。
定数は、一度宣言すると上書きできません。
変数と違って名前の先頭に$は付けず、慣習としてMAX_QUANTITYのように大文字とアンダースコアで書きます。
定数の定義方法は2種類
定数には、constを使った定義方法と、defineを使った定義方法があります。
<?php
// constの例
const MAX_QUANTITY = 0.1;
// defineの例
define('MAX_QUANTITY2', 0.1);
定義した定数は、どちらもecho MAX_QUANTITY;のように名前だけで参照します。
この2つの定義方法には、下のような違いがあります。
constとdefineの違い
以下3つの違いがあります。
- constはif文や関数の中では使えない
- defineではグローバルスコープに値が配置される
- constは名前空間内に配置される
if文や関数の中ではconstが使えないので、defineを使うことになります。
<?php
// 環境によって値を変えたい場合はdefine
if ($_SERVER['SERVER_NAME'] === 'localhost') {
define('DEBUG_MODE', true);
} else {
define('DEBUG_MODE', false);
}
// 名前空間やクラスの中ではconst
namespace App;
const APP_VERSION = '1.2.0'; // App\APP_VERSION として定義される
class Cart
{
const TAX_RATE = 0.1; // クラス定数。Cart::TAX_RATE で参照する
}
逆に、クラス定数はconstでしか作れません。クラスの中でdefineは使えないため、「クラスに属する固定値はconst、実行時に決まるグローバルな設定値はdefine」と覚えると迷いません。
配列も定数にできる
PHP 7.0以降は、constでもdefineでも配列を定数にできます。
<?php
const ALLOWED_TYPES = ['jpg', 'png', 'webp'];
define('SIZES', ['S', 'M', 'L']);
echo ALLOWED_TYPES[0]; // jpg
echo SIZES[1]; // M
配列定数は要素の追加や変更ができないため、「選択肢の一覧」のように固定したいリストに向いています。
なお、古い記事にあるdefine('NAME', 値, true)の第3引数(大文字小文字を区別しない指定)はPHP 8.0で廃止されています。定数名は常に大文字小文字を区別すると考えてください。
定数を使うメリット
定数は、一度宣言すると上書きできないため、値の意味が明確になります。
税率や上限数のような値を本文のあちこちに直接書く代わりに定数へ集めておくと、変更が1か所で済み、途中で書き換えられる心配もなくなります。
定数はどの関数の中からでも名前だけで参照でき、変数のようにglobal宣言は不要です。変数のスコープとの違いはPHPのグローバルスコープ・ローカルスコープ・スーパーグローバルで整理しています。
定義されているかを確認するdefined()
defined()を使うと、二度定義してしまうのを防げます。
同じ名前の定数を2回defineすると警告(PHP 8では定数の再定義でエラー)になるため、設定ファイルを複数回読み込む可能性がある場合に使います。
<?php
if(!defined('MAX_QUANTITY3')) {
define('MAX_QUANTITY3', 0.1);
}
定数にisset()は使えません。isset()は変数専用で、定数の有無を調べるのは必ずdefined()です。変数側の確認方法はPHPのisset()とempty()の使い方を参考にしてください。