Question

I'm looking for an alternative for define('name', array) as using an array in define gives me this error:

Constants may only evaluate to scalar values in ...

The array I'm mentioning contains strings only.

Was it helpful?

Solution

From php.net...

The value of the constant; only scalar and null values are allowed. Scalar values are integer, float, string or boolean values. It is possible to define resource constants, however it is not recommended and may cause unpredictable behavior.

But You can do with some tricks :

define('names', serialize(array('John', 'James' ...)));

& You have to use unserialize() the constant value (names) when used. This isn't really that useful & so just define multiple constants instead:

define('NAME1', 'John');
define('NAME2', 'James');
..

And print like this:

echo constant('NAME'.$digit);

OTHER TIPS

This has changed in newer versions of PHP, as stated in the PHP manual

From PHP 5.6 onwards, it is possible to define a constant as a scalar expression, and it is also possible to define an array constant.

If you are on php5.6 and you know that this version onward php does support arrays as constants. But you are still getting the following warning...

Warning: Constants may only evaluate to scalar values

Then you are in luck. Its because the method of defining array constants using define() is still not introduced in this version and has only been introduced inside phpv7.xx

So instead you can use the const keyword.

const MY_SUPER_CONSTANT = array(
    'cool_key'      => 'Cool Value',
    'ultra_fab_key' => 'Fabulous Value',
);

Define only works to define constants; The manual states:

The value of the constant; only scalar and null values are allowed. Scalar values are integer, float, string or boolean values. It is possible to define resource constants, however it is not recommended and may cause unpredictable behavior.

which is why an array won't work.

So for an array of constants, you could consider building a class that contains these constants, and can return them based on an array-type call?

You can use json_encode function to encode the array as json string and define it as a constant to be used in any place where the constant is accessible.

Example :

// Define the array

$MyArray = array(
    "mykey"  => "myvalue",
    "mykey1" => "myvalue1"
);
define('MYARRAY', json_encode($MyArray));

// Decode the constant and use.
$UseMyArray = json_decode(MYARRAY);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top