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関数で定数を作るときの違いについてです。
まとめると、下記のようになります。
・define関数を使うと、if文のブロック内で定義できる。
・constキーワードを使うと、クラスの中で定数を定義することができる。
・define関数では、クラスの中で定数を定義できない。
・constキーワードでは、定義できる定数の型は限られる。
・define関数では、オブジェクトなども設定できる。
コメント