PHPで定数を使う方法まとめ!(define, const)

PHP

PHPで定数を使う方法について書いています。
PHPで定数を作るときには、constキーワードかdefine関数を使って定義することができます。

載せているサンプルコードについては、PHPのバージョン8.1.12を使って検証しています。
それでは、確認していきましょう。

PHPの定数とは?

定数は一意になる名前に、値を関連づけたものです。
そして、定数は最初に設定した値から値を変えることはできません。

例えば、下記のように作成して使うことができます。

<?php
const MY_BLOG_URL = 'https://codelikes.com';

echo MY_BLOG_URL; // https://codelikes.com

最初にMY_BLOG_URLという定数を作りました。

constキーワードを使って、定数を定義しています。
左側に定数名を書いて、代入演算子(=)で値を入れています。

echoで値を出力すると、「`https://codelikes.com`」というように、入っている内容が出力されます。

変数のように値を変えることはできません。
例えば、下記のように値を変えようとします。

<?php
const MY_BLOG_URL = 'https://codelikes.com';

MY_BLOG_URL = 'https:/example.com';
echo MY_BLOG_URL;

そうすると、このようにエラーになります。
Parse error: syntax error, unexpected token "=" in xxx.php on line 4

定数の名前の付け方

定数名は文字またはアンダースコアで始まって、任意の文字・数字・アンダースコアが後に続くように書きます。
公式ドキュメントではこちらにPHPの定数についての記載があります。

そのため、下記のように数値を先頭につけるとエラーになります。

<?php
const 1TEST = 100;

constとdefine関数のどちらで作成しても同じようにエラーになります。
実行すると、下記のようにParse errorが発生します。

PHP Parse error: syntax error, unexpected integer "1", expecting identifier in xxx.php on line 10

定数名の先頭は文字かアンダースコアで始めるようにしましょう。

constで定数を作る

constキーワードで定数を定義するときには、先ほどのようにconstを先頭に書いて適切な名前をつけます。

const HELLO_WORLD = 'hello, world!!';

一度定義しておくと、requireなどで別ファイルから定数を読み込んだときにも、後続ファイルでも使うことができます。

大文字と小文字は区別される

定数名の大文字と小文字は区別されます。

<?php
const MY_NUMBER = 100;
echo MY_NUMBER; // 100

const my_number = 70;
echo my_number; // 70

上記では、大文字のMY_NUMBER定数とmy_number定数を作りました。
大文字と小文字は区別されるので、別のものとして使うことができます。

constの定数に代入できる値について

constの定数に代入できる値は、論理型(bool)・数値(int)・浮動少数(float)・文字列(string)と、この4つを含んだ配列(array)になります。
例えば、オブジェクトを代入しようとするとエラーになります。

$stdObject = new stdClass();
$stdObject->number = 100;
$stdObject->text = 'hello';

const TEST = $stdObject;

最初にstdClassを使って、オブジェクトを作成しました。
その後にTEST定数にオブジェクトを代入しようとしていますが、ここでエラーになります。

出力されるエラーは下記です。
Fatal error: Constant expression contains invalid operations in xxx.php on line 45

クラスの中で定義することができる

constで定数を作るときには、クラスの中で定義することもできます。
例えば、下記のように使います。

class User {
    const MY_NAME = 'taro';

    public function fetchName() {
        return self::MY_NAME;
    }
}

$user = new User();
echo $user->fetchName();

最初にUserクラスを作成しました。
constキーワードでクラスの中にMY_NAMEという定数を定義しています。

クラスのfetchNameメソッドで、MY_NAMEにアクセスして定数の値を返すようにしました。
クラス内の定数にアクセスするときには、このようにselfを使います。

ifブロックで定義することができない

constはif文のブロックで定義することはできません。
下記のように、if文のブロック内で定義しようとするとエラーになります。

if (true) {
    const TEST = 'test';
}

定義しようとすると、このようにParse errorが発生します。
Parse error: syntax error, unexpected token "const" in xxx.php on line 51

define関数で定数を作る

define関数を使って、定数を定義することもできます。

<?php
define('MY_NUMBER', 999);

echo MY_NUMBER; // 999

define関数を使って、MY_NUMBER定数を作りました。
第1引数に定数名、第2引数に定数の値を渡します。

使うときには、第1引数に渡した定数名を使ってアクセスします。
echoで出力すると、定義した「999」が出力されました。

define関数でも大文字と小文字は区別されます。
PHP7.3以前は大文字・小文字を区別しない定数が定義できましたが、PHP8.0.0以降では定義できなくなったようです。
公式のこちらのドキュメントに書いています。

オブジェクトを格納することもできる

define関数ではオブジェクトを定数として、値に設定することもできます。
例えば、下記のように書きます。

$stdObject = new stdClass();
$stdObject->number = 100;
$stdObject->text = 'hello';

define('TEST', $stdObject);
echo TEST->text; // hello

最初にstdClassを使って、オブジェクトを作成しました。
numberプロパティに「100」を、testプロパティに「hello」を設定しました。

その後に、define関数でTESTという定数に対して、作ったオブジェクトを設定しています。
define関数のときには、これはエラーにならず定義することができます。

作成したTEST定数からオブジェクトのtestプロパティにアクセスすると、設定した「hello」が出力されました。

クラスの中では定義できない

define関数はクラスの中で使うことができません。
下記のコードはエラーになります。

<?php
class User {
    define('USER_NAME', 'taro');
}

実行すると、下記のParse errorが発生します。
Parse error: syntax error, unexpected identifier "define", expecting "function" or "const" in xxx.php on line 72

define関数で定数をクラスの外で書いておいて、クラス内で呼び出すことは可能です。
ですが、そのクラスでしか使わないものであればconstで定義する方が良いでしょう。

if文の中で定義できる

define関数で定数を作るときには、if文を使って分岐することが可能です。
例えば、下記のように分岐して定義できます。

<?php
$flag = true;
if ($flag) {
    define('MY_SCORE', 20);
} else {
    define('MY_SCORE', 50);
}

echo MY_SCORE; // 20

最初に$flag変数にtrueを代入しています。

if文で$flag変数を参照して、trueなので、MY_SCOREという定数名で「20」が定義されます。
$flag変数がfalseのときには、MY_SCOREは「50」になります。

このようにプログラムで分岐して、定数の値を分岐して定義することができます。
環境ごとに定数を分けることができそうですね。

constとdefine関数の違いまとめ

今回はPHPで定数を使う方法についてまとめました。
最後にconstキーワードとdefine関数で定数を作るときの違いについてです。

まとめると、下記のようになります。

・constキーワードで定義するときには、if文のブロック内で定義できない。
・define関数を使うと、if文のブロック内で定義できる。
・constキーワードを使うと、クラスの中で定数を定義することができる。
・define関数では、クラスの中で定数を定義できない。
・constキーワードでは、定義できる定数の型は限られる。
・define関数では、オブジェクトなども設定できる。

コメント

タイトルとURLをコピーしました