なんとなくてきとーに書いたけど
見てくれている方が結構いるみたいなので 名前空間 について追記しました
どちらも定数を定義するときに使う
<?php
define('MY_CONST_1', 'defineで定義した定数');
const MY_CONST_2 = 'constで定義した定数';
echo MY_CONST_1;
// defineで定義した定数
echo MY_CONST_2;
// constで定義した定数
1.関数と構文
define
は関数
const
は構文
define
は関数の呼び出しのオーバーヘッドがあるため 遅い
const
は関数じゃないから 速い
2.変数や、関数の戻り値を使えるか使えないか
define
は変数や、関数の戻り値を使える
<?php
$val = '適当な変数';
define('MY_CONST', $val);
echo MY_CONST; // 適当な変数
<?php
define('NOW', microtime(true));
echo NOW; // 1579431033.9034
const
は変数や、関数の戻り値を使えない
<?php
$val = '適当な変数';
const MY_CONST = $val;
// PHP Fatal error: Constant expression contains invalid operations in ...
<?php
const NOW = microtime(true);
// PHP Fatal error: Constant expression contains invalid operations in ...
いったん定数にすれば使える
<?php
define('NOW', microtime(true));
const MY_CONST = NOW;
echo MY_CONST; // 1579431879.0664
3.トップレベル以外で使えるか使えないか
const
は if
や for
function
の中では使えない
<?php
if (true) {
define('MY_CONST', 'defineはifの中でも使える');
}
<?php
if (true) {
const MY_CONST = 'constは構文エラーになる';
// PHP Parse error: syntax error, unexpected 'const' (T_CONST) in ...
}
4.クラス定数
define
はクラス定数を定義するときに使えない
<?php
class Example
{
public define('MY_CONST', 'defineは関数だから構文エラーになる');
}
// PHP Parse error: syntax error, unexpected 'define' (T_STRING), expecting function (T_FUNCTION) or const (T_CONST) in ...
<?php
class Example
{
public const MY_CONST = 'クラス定数を定義するときに使う';
}
echo Example::MY_CONST;
// クラス定数を定義するときに使う
5.名前空間
const
は名前空間上に登録される
define
はグローバルに登録される
<?php
namespace My {
define('MY_CONST', 'defineで定義した定数');
const MY_CONST = 'constで定義した定数';
}
namespace Example {
echo MY_CONST; // defineで定義した定数
echo \My\MY_CONST; // constで定義した定数
}
まとめ
クラス定数を定義するときは const
を使う
クラス定数以外は const
を使うと速いけど
何回も定義するわけじゃないし、 const
には制約もあるから
define
を使った方が無難
define
は実行時じゃないと何が入っているか分からないしグローバル汚染になるので const
がおすすめ