downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

defined> <constant
Last updated: Fri, 13 Nov 2009

view this page in

define

(PHP 4, PHP 5)

define名前を指定して定数を定義する

説明

bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )

実行時に、名前を指定して定数を定義します。

パラメータ

name

定数の名前。

value

定数の値。スカラー値あるいは null 値のみを指定できます。 スカラー値とは integerfloatstringboolean のいずれかのことです。リソース定数を定義することもできますが、 推奨できません。予期せぬ振る舞いをする可能性があります。

case_insensitive

TRUE を指定すると、定数は大文字小文字を区別しないようになります。 デフォルトでは大文字小文字を区別します。つまり CONSTANTConstant は別の値を表すわけです。

返り値

成功した場合に TRUE を、失敗した場合に FALSE を返します。

例1 定数の定義

<?php
define
("CONSTANT""Hello world.");
echo 
CONSTANT// "Hello world." を出力します
echo Constant// "Constant" を出力し、警告が発生します

define("GREETING""Hello you."true);
echo 
GREETING// "Hello you." を出力します
echo Greeting// "Hello you." を出力します

?>

参考

  • defined() - 指定した名前の定数が存在するかどうかを調べる
  • constant() - 定数の値を返す
  • 定数の節



defined> <constant
Last updated: Fri, 13 Nov 2009
 
add a note add a note User Contributed Notes
define
bohwaz.net
16-Aug-2009 12:54
Note that define don't care at all about the constant name, you can give everything as a constant name, even if the PHP documentation says that the allowed characters are [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*

Just try this :

<?php define('anything::()$', 'test'); ?>

You won't be able to access this constant though, it will throw a parse error, either through constant() or define(), but if you do that :

<?php print_r(get_defined_constants()); ?>

You will see that the constant is registered at the end of the array. Yes that's totally useless. But you can try other things that will work with constant() :

<?php define('...', 'test'); echo constant('...'); ?>

Will echo 'test'. Yeah that's a pretty strange behavior.

And please note that defining object constants outside of objets don't work :

<?php
class myObject { }
define('myObject::CONSTANT', 'test');
?>
Anonymous
20-Jul-2009 05:31
My notice to: redeclare define -  it is possible

php -v

--> PHP 5.2.6-3ubuntu4.1 with Suhosin-Patch 0.9.6.2
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
php -r "define('TEST','foo',true);
var_dump(TEST);
define('TEST','bar');
var_dump(TEST);"

string(3) "foo"
string(3) "bar"

greetings
sixd at php dot net
17-Jul-2009 09:24
A note on redefining:

Constants can't be redefined:

$ php -r "define('A', 1); var_dump('A'); define('A', 2); var_dump('A');";
string(1) "A"
PHP Notice:  Constant A already defined in Command line code on line 1
string(1) "A"

But using the case insensitive setting shows that the internal
representation is lower case:

$ php -r "define('A', 1, true); var_dump('A'); define('A', 2); var_dump('A');";
string(1) "A"
string(1) "A"

Note the lower case 'a' in the second define() here:
$ php -r "define('A', 1, true); var_dump('A'); define('a', 2); var_dump('A');";
string(1) "A"
PHP Notice:  Constant a already defined in Command line code on line 1
string(1) "A"
danbettles at yahoo dot co dot uk
14-Apr-2009 06:56
define() will define constants exactly as specified.  So, if you want to define a constant in a namespace, you will need to specify the namespace in your call to define(), even if you're calling define() from within a namespace.  The following examples will make it clear.

The following code will define the constant "MESSAGE" in the global namespace (i.e. "\MESSAGE").

<?php
namespace test
;
define('MESSAGE', 'Hello world!');
?>

The following code will define two constants in the "test" namespace.

<?php
namespace test
;
define('test\HELLO', 'Hello world!');
define(__NAMESPACE__ . '\GOODBYE', 'Goodbye cruel world!');
?>
Aldonio
27-Mar-2009 04:24
This code will define every key of an array, and if its a multidimentional array it will define it as parent_child1_child2_etc.

<?php
function define_array( $array, $keys = NULL )
{
    foreach(
$array as $key => $value )
    {
       
$keyname = ($keys ? $keys . "_" : "") . $key;
        if(
is_array( $array[$key] ) )
           
define_array( $array[$key], $keyname );
        else
           
define( $keyname, $value );
    }
}
?>
ceo at l-i-e dot com
11-Mar-2009 10:04
In PHP 4.4.9, you cannot use certain names for constants.

Specifically, reserved words such as 'PRINT', 'IF', etc.

Oddly enough, you get different behaviour for some:

<?php
define
('IF', 42);
echo
"IF: ", IF, "<hr />\n";
?>

yields PHP Parse error:  syntax error, unexpected T_IF

<?php
define
('PRINT', 13);
echo
"PRINT: ", PRINT, "<hr />\n";
?>

yields PHP Parse error:  syntax error, unexpected ')'

Not sure if this is still true in PHP 5 or not, but it's worth noting if it is.
Anonymous
09-Mar-2009 09:03
With php 5.30 it is possible to make some "restrictions", in case u use namespaces...
The following function allows only uppercase and, if 3 param isset, gives E_USER_ERROR instead of E_NOTICE:

<?php
namespace bla
;

function
define($c,$v,$x=false) {
   
$c = strtoupper($c);
    if (!
defined($c)) {
       
// not to use \define here, as the syntax highlighting does not work correctly here...
       
return define($c, $v, true);
    } else if (
$x == true) {
       
trigger_error('setting constant "'.$c.'" is not allowed', E_USER_ERROR);
    }
    return
null;
}

define('PHP_VERSION', '1');
define('PHP_VERSION', '1') || trigger_error('constant already defined', E_USER_NOTICE);
define('PHP_VERSION', '1', true);
?>
jv at vip dot ie
09-Mar-2009 12:14
Probably the most efficient way of creating a constant array is to put it in a function like this:

<?php
function my_const_arr()
{
   return array
   (
     
'key1' => 'val 1',
     
'key2' => 'va' 2
  
);
}
?>

Then use at will like so...
<?php $my_const_arr = my_const_arr(); ?>
usuroer dot king at hotmail dot co dot uk
08-Mar-2009 12:15
Referring to "This-Is-A-Test" constant below.

When echoing it the script thinks you performing a series of minus (subtraction) thus since THIS and IS, A, TEST are not defined they are 0 by default. So 0-0-0-0 = 0.

As explained that a hyphen cannot be used within a variable.
downwind at web dot de
02-Feb-2009 04:48
I'm reffering to the note below by mittiprovence.

The described behavior has nothing to do with the fact that there is a constant in the condition.

Comparing a non-numeric string to the integer 0 by using == will return true, since the string will be casted to integer - which will be zero. If your string starts with a number, it will be castet to an integer with the number as value.

To avoid the described behavior, you should use === instead of ==.

Finally, the behavior discribed by mittiprovence is exacly the expected behavior as defined in the manual.

For further information read the manual:

http://www.php.net/manual/en/types.comparisons.php

http://www.php.net/manual/en/language.operators.comparison.php

http://www.php.net/manual/en/language.types.string.php #language.types.string.conversion

<?php

if (0 == "some string") { // is true
echo "0 == 'some string'";
}

if (
1 == "some string") { // is false
echo "1 == 'some string'";
}

if (
1 == "1 some string") { // is true
echo "1 == '1 some string'";
}

if (
0 === "some string") { // is false
echo "0 === 'some string'";
}

?>
eparkerii at carolina dot rr dot com
22-Oct-2008 07:01
Found something interesting.  The following define:

<?php
define
("THIS-IS-A-TEST","This is a test");
echo
THIS-IS-A-TEST;
?>

Will return a '0'.

Whereas this:

<?php
define
("THIS_IS_A_TEST","This is a test");
echo
THIS_IS_A_TEST;
?>

Will return 'This is a test'.

This may be common knowledge but I only found out a few minutes ago.

[EDIT BY danbrown AT php DOT net: The original poster is referring to the hyphens versus underscores.  Hyphens do not work in defines or variables, which is expected behavior.]
pistachio
01-Sep-2008 11:41
A better solution to that of thscheer at web dot de, is to simply serialize the array.

for example:

<?php

$fruits
= array("apple", "banana", "orange");

define("FRUITS", serialize($fruits));

// Now to use it
$my_fruits = unserialize(FRUITS);

?>

As you can see this is a much simpler and more efficient way to stuff arrays into constants.
jan at webfontein dot nl
27-Jul-2008 12:20
For translating with variables and define, take also a look on the constant() function.

Example :

<?php
define
('PAYMENT_IDEAL',"iDEAL Payment ( NL only )");
define('PAYMENT_MASTERCARD',"Mastercard Payment ( international )");

$payparam='MASTERCARD';

echo
constant("PAYMENT_$payparam");

// output :
// Mastercard Payment ( international )
?>
thscheer at web dot de
20-Jun-2008 09:18
How to define an array as constant with define?

there is a simple way to define an array of values as constant...

just

define ("constant-name","value1,value2,value3,value4");

$t_array = preg_split('/,/', constant(constant-name), -1, PREG_SPLIT_NO_EMPTY);

var_dump($t_array);

array(4) { [0]=> string(6) "value1" [1]=> string(6) "value2" [2]=> string(6) "value3" [3]=> string(6) "value4" }

Now you can iterate over the array defined as constant ...
ceo at l-i-e dot com
05-May-2008 03:30
I'm not sure if it's version dependent, but apparently this works:
define('APPLICATION_NOW', time());

This can be quite handy for time-dependent code...

You can then do:
class foo {
  $private now = APPLICATION_NOW;
}

and have a consistent time-stamp across the application, which is nice.

Works for me in 5.2.5

I didn't think it worked before...
jason@sitehatchery dot com
25-Apr-2008 06:28
You can store your constant as the value of a variable like this:

$variable=VARIABLE;

To access the constant, do this:  constant($variable).

Beware: if your variable changes, then you loose your reference to the constant - but the constant itself will not change.

I've found this especially useful for storing the constant string   (i.e. VARIABLE) in a database.
rayro at gmx dot de
15-Sep-2007 09:53
just a note to the previous post by e s lin d sey at g mail dot co m:

Well as u said, it is not the best workaround. To resolve this "Problem" without getting incredible loss of performance, you are able to make the use of "variable functions" like "variable variables":

<?php
$def
= 'constant';
$string = <<<END
    This is PHP running on<br />
   
{$def('PHP_OS')}
END;
var_dump($string);
?>

In this example we make use of the "constant" function which is builtin, and it will output:

string(37) " This is PHP running on
WINNT"

Tested on PHP 5...
Best regards
e s lin d sey at g mail dot co m
13-Aug-2007 08:38
Constants can't be referenced from within quotes or (more importantly IMHO) from within HEREDOC syntax. This is a huge drawback in my opinion. Here's two of my workarounds:

<?php

//PHP5 only -- more efficient
$constarray = get_defined_constants(true);
foreach(
$constarray['user'] as $key => $val)
    eval(
sprintf('$_CONSTANTS[\'%s\'] = \'%s\';', addslashes($key), addslashes($val)));

//PHP4+ -- less efficient because it defines (potentially) hundreds of unnecessary constants
foreach(get_defined_constants() as $key => $val)
    eval(
sprintf('$_CONSTANTS[\'%s\'] = \'%s\';', addslashes($key), addslashes($val)));

?>

Now you can refer to your defined constants using the $_CONSTANTS array. Note that because this is NOT a superglobal, a few caveats apply:

<?php

//run code snippet here to define $_CONSTANTS in global scope...

$mv = $_CONSTANTS['FOO']; //works

function my_function1()
{
   
$mv = $_CONSTANTS['BAR']; //doesn't work! not defined!
}

function
my_function2()
{
    global
$_CONSTANTS;
   
$mv = $_CONSTANTS['BAR']; //ah, this works!
}

?>

I realize this is not ideal, either for performance or for convenience of being able to refer to constants without regard to scope, but it is a workaround that works. Depending on your application, it may be easier to shift your paradigm a bit and use the following method instead, declaring your constants as variables first:

<?php

//first, define our constants...
$_CONSTANTS['FOO'] = 'bar';
$_CONSTANTS['BAR'] = 'foo';

//now, turn them into real constants...
foreach($_CONSTANTS as $key => $val)
   
define($key, $val);

//now, you can use either format to refer to a constant
print($_CONSTANTS['FOO']);   //prints 'bar'
print(FOO);                  //prints 'bar'
print("$_CONSTANTS['FOO']"); //prints 'bar'
                             //prints 'blah bar blah'
print <<<EOF
  blah {$_CONSTANTS['FOO']} blah
EOF;

?>

Hope this helps some of you out there, I know being able to utilize my constants in HEREDOC helped me a ton!
smifffy at smith-net dot org dot uk
25-Jul-2007 11:23
a basic function to auto assign a numeric value that increase by itself each time - used in some permission style scripts

<?php
function define_bitwise($constant_name, $reset = False)
{
    static
$bitwise_next = 1;

    if (
$reset === True )
    {
       
$bitwise_next = 1;
    }

   
define($constant_name, $bitwise_next);
       
   
$bitwise_next += $bitwise_next;
}
?>

when reset it set to True, resets that value to 1 and starts afresh
creeves at dja dot com
19-Jul-2007 01:59
Intersting to note:

I found this in php5 on windows

If you try to unset a constant (which you cant but maybe you have a Jr. programmer or something).  The error message that is thrown is:

<?php
define
("SOME_CONSTANT", true);
unset (
SOME_CONSTANT);
?>

Parse error: parse error, unexpected ')', expecting T_PAAMAYIM_NEKUDOTAYIM
nl-x at bita dot nl
09-Jul-2007 05:34
Watch out. You can define a new constant with the name NULL with define("NULL","FOO");. But you must use the function constant("NULL"); to get it's value. NULL without the function call to the constant() function will still retrieve the special type NULL value.
Within a class there is no problem, as const NULL="Foo"; will be accessible as myClass::NULL.
stangelanda at arrowquick dot com
01-Jan-2007 02:59
An improvement on the function from bobbykjack at yahoo dot co dot uk on the concept by richard dot quadling at bandvulc dot co dot uk:
<?php
function adefine($constant_name, $value=null) {
    static
$increment = 0; // 1 for bitmask

   
if (is_null($value)) {
       
define($constant_name, ++$increment); // $increment=$increment<<1 for bitmask
   
} else {
       
define($constant_name, $value);
        if (
is_numeric($value)) {
           
$increment = $value;
        }
    }
}
?>
If you pass it a second argument it defines it normally, and resets the increment if the value is numeric.  This way the function can replace define, and you can reset the counter for a new set of constants.
<?php
adefine
('RULE_CALLBACK_FORMAT', 1); // 1
adefine ('RULE_CHANGE_CALLBACK_ON_ERROR'); // 2
adefine ('RULE_CHANGE_COMPARE_DATE'); // 3
adefine('KEYWORD', 'hodgepodge'); // hodgepodge <-- defined normally
adefine ('RULE_CHANGE_ON_DATE'); // 4

adefine ('ERROR_DESC', 1); // 1 <-- Counter reset
adefine ('ERROR_EXPECTED_RESULT'); // 2
?>
12-Feb-2005 04:45
Better pack with define() for all who really miss Java package management:

Use this "manifest.php" on very first script start or copy it to your config.somehow.php.

<?php
$__packages
= array(
   
"org.ilove.java.more",
   
"org.ilove.python.too",
   
"net.php.isok"
);

define("C_IS_WINDOWS", false);
define("C_DIR", (C_IS_WINDOWS ? "\\" : "/"));
define("C_PATH_ROOT", str_replace("/", C_DIR, $_SERVER["DOCUMENT_ROOT"]).C_DIR);
define("C_PATH_CORE", C_PATH_ROOT."core".C_DIR);
define("C_PATH_CLASS", C_PATH_CORE."classes".C_DIR);
define("C_APPLICATION_BASE", C_PATH_CORE.C_DIR."application".C_DIR);

$total_packages = 0;
$i = sizeof($__packages);
while(
$i-- > 0) {
   
$tokens = explode(".", $__packages[$i]);
   
$j = sizeof($tokens);
    while(
$j-- > 0) {
       
$token = strtolower(trim($tokens[$j]));
        if(
strlen($token) > 0 && !defined($token)) {
           
define($token, ($j == 0 ? C_PATH_CLASS : "").$tokens[$j].C_DIR);
           
$total_packages++;
        }
    }
}
define("C_PACKAGE_COUNT", $total_packages);
?>

With restrictions on non-package constants, you now can call your files like that:

<?php

require_once org.ilove.java.more."Than.php";

?>

Regards
Robi
phpnet at trenkner dot de
14-Mar-2003 11:59
---[Editor's Note]---
As of PHP 5.0.0 this is possible. You can define class-only constants, which can be called like Foo::Constant1 from the outside
---[End Note]---

Please keep in mind that

class AClass {
  define ("Const1", "Value1");
  ... }

didn't work. You have to make all your constant definitions before you open the class. So

define ("Const1", "Value1");
class AClass {
  ... }

would be correct.
radovan dot biciste at managestar dot com
07-Nov-2001 04:45
Wonder how to work with variable which name is stored in a constant?
Here it is:
<?php
define
("VAR_NAME","test");
// assigning value
${VAR_NAME} = "value";
// getting value back
echo ${VAR_NAME};
?>
ste at opk dot no
29-Aug-2001 05:41
To use a constant to show an element of an array inside a string:
define ('C', 0); print ("element 0: {$a[C]}");
The { & } around the variable signals that what's inside should be treated as a variable and not a string.
Note that 'print ("a constant:{C}");' wont work as ZERO is a constant.

defined> <constant
Last updated: Fri, 13 Nov 2009
 
 
show source | credits | sitemap | contact | advertising | mirror sites