Quantcast
Channel: #! code - PHP Questions
Viewing all articles
Browse latest Browse all 10

PHP Question: Defining Constants

$
0
0

Question

What does the following code do?

 

define("MY_CONSTANT",array(1,2,3,4,5));










Answer

If this code is run it will produce the following error:

Warning: Constants may only evaluate to scalar values in test.php on line x

This is because only scalar values can be assigned to constants. A scalar value is any integer, float, string or boolean value and does not include arrays, objects or resources. Trying to set any non-scalar value as a constant will produce this error.

If we went on to var_dump() the constant defined above we would get back a string containing "MY_CONSTANT". This is because if you try to retrive any constant value that hasn't been set PHP will try to evaluate it as a string. What this means is that if you try to do a simple boolean test for the constant (see the example below) it will evaluate to true.

1
2
3
if(MY_CONSTANT){  echo'constant set, or not...';}

We can test for the existence of the constant in a couple of ways. We already know that any constant that isn't defined is cast as a string so we can test for this by doing a type comparison between the constant and a string of the constant name. If the constant is defined then this will equal false.

var_dump(MY_CONSTANT ==='MY_CONSTANT');// true if constant not set

However, when we do this we get the following notice about using an undefined constant and that PHP has cast it as a string.

Notice: Use of undefined constant MY_CONSTANT - assumed 'MY_CONSTANT' in test.php on line x

The built in PHP function defined() can be used to test for the existence of a constant value. This accepts a string of the constant name and will return a boolean value that shows if the constant has been set or not. This also avoids the need to try out the constant itself and get a notice if it isn't defined.

var_dump(defined('MY_CONSTANT'));// false

There are a couple of ways to get around the restriction of only allowing scalar values to be used in constants. The first way is to use serialize() to convert the array into a string before setting it as a constant.

1
2
3
define("MY_CONSTANT",serialize(array(1,2,3,4,5)));var_dump(defined('MY_CONSTANT'));// prints truwprint_r(unserialize(MY_CONSTANT));

We could also use json_encode() here, which will have the same effect. This probably isn't the best way to set constant values, although it is perfectly allowed in PHP. The other way to get a constant with an array is to use a static variable in a class. This is effectively a constant as it won't (at least it shouldn't) be changed during the execution of the script.

1
2
3
4
5
class Constants {     public static $myConstant=array(1,2,3,4,5);} 
print_r(Constants::$myConstant);

This will print out the array in full.

Note that you can't set arrays to be constants in classes as you will get a fatal error instead of a warning. For example, the following script.

1
2
3
4
5
class Constants {     const MY_CONSTANT =array(1,2,3,4,5);} 
print_r(Constants::MY_CONSTANT);

Will produce the following error when run.

Fatal error: Arrays are not allowed in class constants in test.php on line x
Category: 

Viewing all articles
Browse latest Browse all 10

Trending Articles