Hướng dẫn dùng define exists trong PHP

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

Show

definedChecks whether a given named constant exists

Description

defined(string $constant_name): bool

Note:

If you want to see if a variable exists, use isset() as defined() only applies to constants. If you want to see if a function exists, use function_exists().

Parameters

constant_name

The constant name.

Return Values

Returns true if the named constant given by constant_name has been defined, false otherwise.

Examples

Example #1 Checking Constants

/* Note the use of quotes, this is important.  This example is checking
 * if the string 'TEST' is the name of a constant named TEST */
if (defined('TEST')) {
    echo 
TEST;
}
?>

See Also

  • define() - Defines a named constant
  • constant() - Returns the value of a constant
  • get_defined_constants() - Returns an associative array with the names of all the constants and their values
  • function_exists() - Return true if the given function has been defined
  • The section on Constants

daniel at neville dot tk

14 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.)

defined

('CONSTANT') or define('CONSTANT', 'SomeDefaultValue');?>

Dan.

ASchmidt at Anamera dot net

5 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';

tris+php at tfconsulting dot com dot au

13 years ago

Before using defined() have a look at the following benchmarks:

true                                       0.65ms
$true                                      0.69ms (1)
$config['true']                            0.87ms
TRUE_CONST                                 1.28ms (2)
true                                       0.65ms
defined('TRUE_CONST')                      2.06ms (3)
defined('UNDEF_CONST')                    12.34ms (4)
isset($config['def_key'])                  0.91ms (5)
isset($config['undef_key'])                0.79ms
isset($empty_hash[$good_key])              0.78ms
isset($small_hash[$good_key])              0.86ms
isset($big_hash[$good_key])                0.89ms
isset($small_hash[$bad_key])               0.78ms
isset($big_hash[$bad_key])                 0.80ms

PHP Version 5.2.6, Apache 2.0, Windows XP

Each 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 identical
2) 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 exists
4) 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'))...

r dot hartung at roberthartung dot de

12 years ago

You can use the late static command "static::" withing defined as well. This example outputs - as expected - "int (2)"

  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());
?>

Lars Lernestal

10 years ago

if you want to check id a class constant is defined use self:: before the constant name:

defined('self::CONSTANT_NAME');
?>

Shaun H

14 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.

    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;
?>

passerbyxp at gmail dot com

9 years ago

This function, along with constant(), is namespace sensitive. And it might help if you imagine them always running under the "root namespace":

namespace 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();
}

louis at louisworks dot de

3 years ago

Dont forget to put the name of your constant into single quotation mark. You will not get an error or a warning.

define("AMOUNT_OF_APPLES", 12);
if(
defined(AMOUNT_OF_APPLES)){
  
//you won't get an output here
  
echo AMOUNT_OF_APPLES;
}
?>

so do instead

define("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...

info at daniel-marschall dot de

13 years ago

I found something out: defined() becomes probably false if a reference gets lost.

session_start

(); // $_SESSION created
define('SESSION_BACKUP', $_SESSION);
if (
defined('SESSION_BACKUP')) echo 'A';
session_unset(); // $_SESSION destroyed
if (defined('SESSION_BACKUP')) echo 'B';?>

You will see "A", but not "B".

ndove at cox dot net

17 years ago

In PHP5, you can actually use defined() to see if an object constant has been defined, like so:

class Generic
{
    const
WhatAmI = 'Generic';
}

if (

defined('Generic::WhatAmI'))
{
    echo
Generic::WhatAmI;
}
?>

Thought it may be useful to note.

-Nick

ohcc at 163 dot com

1 year 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.

    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);
?>

    define('\DOMAIN', 'wuxiancheng.cn');
   
$constants = get_defined_constants();
   
$isDefined = isSet($constants['\DOMAIN']);
   
$domain = $isDefined ? $constants['\DOMAIN'] : NULL;
   
var_dump($isDefined, $domain);
?>

    define('\DOMAIN', 'wuxiancheng.cn');
   
$isDefined = defined('\\\DOMAIN');
   
$domain = constant('\\\DOMAIN');
   
var_dump($isDefined, $domain);
?>

Anonymous

5 years ago

Be careful with boolean defines and assuming a check is done for a specific value by defined such as

define

('DEBUG', false);

if(

defined('DEBUG')){
    echo
'Not really debugging mode';
}
?>

You want to also check the constant as in

define('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.

reachmike at hotpop dot com

13 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:



...may say TEST instead of an empty string like you might expect. The fix is a function like this:

function 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:

(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.

vindozo at gmail dot com

12 years ago

If you wish to protect files from direct access I normally use this:

index.php:

// Main stuff here
define('START',microtime());

include

"x.php";
?>

x.php:

defined('START')||(header("HTTP/1.1 403 Forbidden")&die('403.14 - Directory listing denied.'));
?>

Joel

15 years ago

If your constants don't show up in your included or required files, then you probably have php safe mode turned on!

I ran into this problem, I forgot to turn of safe mode when I was creating a new site.