defined

(PHP 4, PHP 5, PHP 7, PHP 8)

defined指定した名前の定数が存在するかどうかを調べる

説明

defined(string $constant_name): bool

constant_name で指定した定数が定義されているかどうかを調べます。

この関数は クラス定数列挙型の case に対しても動作します。

注意:

変数が存在するかどうかを知りたければ、isset() を利用してください。defined()定数にしか適用できません。 関数が存在するかどうかを知りたければ、 function_exists() を利用してください。

パラメータ

constant_name

定数名。

戻り値

constant_name で指定した名前の定数が定義されている 場合に true、その他の場合にfalseを返します。

例1 定数のチェック

<?php

/* 引用符の使い方に注意してください。これは重要です。この例では
* 文字列 'TEST' が、定数 TEST の名前かどうかを調べています。*/
if (defined('TEST')) {
echo
TEST;
}


interface
bar {
const
test = 'foobar!';
}

class
foo {
const
test = 'foobar!';
}

var_dump(defined('bar::test')); // bool(true)
var_dump(defined('foo::test')); // bool(true)

?>

例2 列挙型のcase をチェックする(PHP 8.1.0 以降)

<?php

enum Suit
{
case
Hearts;
case
Diamonds;
case
Clubs;
case
Spades;
}

var_dump(defined('Suit::Hearts')); // bool(true)

?>

参考

add a note

User Contributed Notes 15 notes

up
127
daniel at neville dot tk
17 years ago
My preferred way of checking if a constant is set, and if it isn't - setting it (could be used to set defaults in a file, where the user has already had the opportunity to set their own values in another.)<?phpdefined('CONSTANT') or define('CONSTANT', 'SomeDefaultValue');?>Dan.
up
14
ASchmidt at Anamera dot net
8 years ago
// Checking the existence of a class constant, if the class is referenced by a variable.class Class_A{    const CONST_A = 'value A';}// When class name is known.if ( defined( 'Class_A::CONST_A' ) )    echo 'Class_A::CONST_A defined';// Using a class name variable. Note the double quotes.$class_name = Class_A::class;if ( defined( "$class_name::CONST_A" ) )    echo '$class_name::CONST_A defined';// Using an instantiated object for a variable class.$object_A = new $class_name();if ( defined( get_class($object_A).'::CONST_A' ) )    echo '$object_A::CONST_A defined';
up
21
Lars Lernestal
13 years ago
if you want to check id a class constant is defined use self:: before the constant name:<?phpdefined('self::CONSTANT_NAME');?>
up
25
tris+php at tfconsulting dot com dot au
16 years ago
Before using defined() have a look at the following benchmarks:true                                       0.65ms$true                                      0.69ms (1)$config['true']                            0.87msTRUE_CONST                                 1.28ms (2)true                                       0.65msdefined('TRUE_CONST')                      2.06ms (3)defined('UNDEF_CONST')                    12.34ms (4)isset($config['def_key'])                  0.91ms (5)isset($config['undef_key'])                0.79msisset($empty_hash[$good_key])              0.78msisset($small_hash[$good_key])              0.86msisset($big_hash[$good_key])                0.89msisset($small_hash[$bad_key])               0.78msisset($big_hash[$bad_key])                 0.80msPHP Version 5.2.6, Apache 2.0, Windows XPEach statement was executed 1000 times and while a 12ms overhead on 1000 calls isn't going to have the end users tearing their hair out, it does throw up some interesting results when comparing to if(true):1) if($true) was virtually identical2) if(TRUE_CONST) was almost twice as slow - I guess that the substitution isn't done at compile time (I had to double check this one!)3) defined() is 3 times slower if the constant exists4) defined() is 19 TIMES SLOWER if the constant doesn't exist!5) isset() is remarkably efficient regardless of what you throw at it (great news for anyone implementing array driven event systems - me!)May want to avoid if(defined('DEBUG'))...
up
25
r dot hartung at roberthartung dot de
15 years ago
You can use the late static command "static::" withing defined as well. This example outputs - as expected - "int (2)"

<?php
  abstract class class1
  {
    public function getConst()
    {
      return defined('static::SOME_CONST') ? static::SOME_CONST : false;
    }
  }
  
  final class class2 extends class1
  {
    const SOME_CONST = 2;
  }
  
  $class2 = new class2;
  
  var_dump($class2->getConst());
?>
up
9
louis at louisworks dot de
6 years ago
Dont forget to put the name of your constant into single quotation mark. You will not get an error or a warning.<?phpdefine("AMOUNT_OF_APPLES", 12);if(defined(AMOUNT_OF_APPLES)){   //you won't get an output here   echo AMOUNT_OF_APPLES;}?>so do instead<?phpdefine("AMOUNT_OF_APPLES", 12);if(defined("AMOUNT_OF_APPLES")){   //here you go   echo AMOUNT_OF_APPLES;}//output: 12?>It took me half an day to see it...
up
12
Shaun H
17 years ago
I saw that PHP doesn't have an enum function so I created my own. It's not necessary, but can come in handy from time to time.<?php    function enum()    {        $args = func_get_args();        foreach($args as $key=>$arg)        {            if(defined($arg))            {                 die('Redefinition of defined constant ' . $arg);            }            define($arg, $key);        }    }        enum('ONE','TWO','THREE');    echo ONE, ' ', TWO, ' ', THREE;?>
up
11
passerbyxp at gmail dot com
12 years ago
This function, along with constant(), is namespace sensitive. And it might help if you imagine them always running under the "root namespace":<?phpnamespace FOO\BAR{    const WMP="wmp";    function test()    {        if(defined("WMP")) echo "direct: ".constant("WMP"); //doesn't work;        elseif(defined("FOO\\BAR\\WMP")) echo "namespace: ".constant("FOO\\BAR\\WMP"); //works        echo WMP; //works    }}namespace{    \FOO\BAR\test();}
up
5
info at daniel-marschall dot de
16 years ago
I found something out: defined() becomes probably false if a reference gets lost.<?phpsession_start(); // $_SESSION createddefine('SESSION_BACKUP', $_SESSION);if (defined('SESSION_BACKUP')) echo 'A';session_unset(); // $_SESSION destroyedif (defined('SESSION_BACKUP')) echo 'B';?>You will see "A", but not "B".
up
5
ndove at cox dot net
20 years ago
In PHP5, you can actually use defined() to see if an object constant has been defined, like so:<?phpclass Generic{    const WhatAmI = 'Generic';}if (defined('Generic::WhatAmI')){    echo Generic::WhatAmI;}?>Thought it may be useful to note.-Nick
up
1
ohcc at 163 dot com
4 years ago
If a constant's name has a leading backslash (\), it's not possible to detect its existence using the defined() function, or to get its value using the constant() function. You can check its existence and get its value using the get_defined_constants() function, or prepend 2 more backslashes (\\) to the constant's name.<?php    define('\DOMAIN', 'wuxiancheng.cn');    $isDefined = defined('\DOMAIN'); // false    $domain = constant('\DOMAIN'); // NULL, in Php 8+ you'll get a Fatal error.    var_dump($isDefined, $domain);?><?php    define('\DOMAIN', 'wuxiancheng.cn');    $constants = get_defined_constants();    $isDefined = isSet($constants['\DOMAIN']);    $domain = $isDefined ? $constants['\DOMAIN'] : NULL;    var_dump($isDefined, $domain);?><?php    define('\DOMAIN', 'wuxiancheng.cn');    $isDefined = defined('\\\DOMAIN');    $domain = constant('\\\DOMAIN');    var_dump($isDefined, $domain);?>
up
2
Anonymous
8 years ago
Be careful with boolean defines and assuming a check is done for a specific value by defined such as<?phpdefine('DEBUG', false);if(defined('DEBUG')){    echo 'Not really debugging mode';}?>You want to also check the constant as in<?phpdefine('DEBUG', true);if(defined('DEBUG') && DEBUG){    echo 'Really this is debugging mode';}?>All defined is doing is verifying the constant exists not it's value.
up
3
vindozo at gmail dot com
14 years ago
If you wish to protect files from direct access I normally use this:index.php:<?php// Main stuff heredefine('START',microtime());include "x.php";?>x.php:<?phpdefined('START')||(header("HTTP/1.1 403 Forbidden")&die('403.14 - Directory listing denied.'));?>
up
-1
Pieter Frenssen
1 year ago
To check in a trait if a constant is defined in the class using the trait, prepend the constant name with `self::class`:<?phptrait MyTrait {  public function checkConstant() {    assert(defined(self::class . "::MY_CONSTANT"));    print self::MY_CONSTANT;  }}class MyClass {  use MyTrait;  protected const MY_CONSTANT = 'my value';}$class = new MyClass();$class->checkConstant();?>
up
1
reachmike at hotpop dot com
16 years ago
You may find that if you use <?= ?> to dump your constants, and they are not defined, depending on your error reporting level, you may not display an error and, instead, just show the name of the constant. For example:<?= TEST ?>...may say TEST instead of an empty string like you might expect. The fix is a function like this:<?phpfunction C(&$constant) {    $nPrev1 = error_reporting(E_ALL);    $sPrev2 = ini_set('display_errors', '0');    $sTest = defined($constant) ? 'defined' : 'not defined';    $oTest = (object) error_get_last();    error_reporting($nPrev1);    ini_set('display_errors', $sPrev2);    if ($oTest->message) {        return '';    } else {        return $constant;    }}?>And so now you can do:<?= C(TEST) ?>If TEST was assigned with define(), then you'll receive the value. If not, then you'll receive an empty string.Please post if you can do this in fewer lines of code or do something more optimal than toggling the error handler.
To Top