PHP
定数
define
const
45
どのような問題がありますか?

投稿日

更新日

Organization

PHPの「define」と「const」の違い

なんとなくてきとーに書いたけど
見てくれている方が結構いるみたいなので 名前空間 について追記しました

どちらも定数を定義するときに使う

<?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.トップレベル以外で使えるか使えないか

constiffor 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 がおすすめ

ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
schrosis
・ヮ・)あ、おはようございまーす PHP(Laravel/CakePHP/CodeIgniter)、JavaScript(TypeScript/Vue/Nuxt/Electron/ReactNative/jQery/p5)、Python、Swift、Java、C#、Dockerなどなど
yumemi
みんな知ってるあのサービスも、ゆめみが一緒に作ってます。スマホアプリ/Webサービスの企画・UX/UI設計、開発運用の内製化支援。Swift, Kotlin, PHP, Vue.js, React.js, Node.js, AWS等エンジニア・クリエイターの会社です。Twitterで情報配信中https://twitter.com/yumemiinc
この記事は以下の記事からリンクされています

コメント

この記事にコメントはありません。
あなたもコメントしてみませんか :)
ユーザー登録
すでにアカウントを持っている方はログイン
記事投稿イベント開催中
データに関する記事を書こう!
~
新人プログラマ応援 - みんなで新人を育てよう!
~
45
どのような問題がありますか?
ユーザー登録して、Qiitaをもっと便利に使ってみませんか

この機能を利用するにはログインする必要があります。ログインするとさらに下記の機能が使えます。

  1. ユーザーやタグのフォロー機能であなたにマッチした記事をお届け
  2. ストック機能で便利な情報を後から効率的に読み返せる
ユーザー登録ログイン
ストックするカテゴリー