PHP常量包含数组?

这个失败:

 define('DEFAULT_ROLES', array('guy', 'development team'));

显然,常量不能保存数组。解决这个问题的最好方法是什么?

define('DEFAULT_ROLES', 'guy|development team');


//...


$default = explode('|', DEFAULT_ROLES);

这似乎是不必要的努力。

342804 次浏览

常量只能包含标量值,我建议您存储数组的序列化(或JSON编码表示)。

你可以将它们存储为类的静态变量:

class Constants {
public static $array = array('guy', 'development team');
}
# Warning: array can be changed lateron, so this is not a real constant value:
Constants::$array[] = 'newValue';

如果你不喜欢数组可以被其他人更改的想法,getter可能会有所帮助:

class Constants {
private static $array = array('guy', 'development team');
public static function getArray() {
return self::$array;
}
}
$constantArray = Constants::getArray();

编辑

从PHP5.4开始,甚至可以在不需要中间变量的情况下访问数组值,即以下工作:

$x = Constants::getArray()['index'];

PHP 5.6+引入了const数组- 请看Andrea Faulds的回答.数组。

你也可以序列化你的数组,然后把它放入常量:

# define constant, serialize array
define ("FRUITS", serialize (array ("apple", "cherry", "banana")));


# use it
$my_fruits = unserialize (FRUITS);

如果你使用的是php5.6或以上版本,使用Andrea Faulds的答案

我是这样用的。我希望,这将帮助其他人。

config。

class app{
private static $options = array(
'app_id' => 'hello',
);
public static function config($key){
return self::$options[$key];
}
}

在文件中,我需要常数。

require('config.php');
print_r(app::config('app_id'));

使用爆炸和内爆函数,我们可以临时想出一个解决方案:

$array = array('lastname', 'email', 'phone');
define('DEFAULT_ROLES', implode (',' , $array));
echo explode(',' ,DEFAULT_ROLES ) [1];

这将回显email

如果你想让它更优化,你可以定义2个函数来做重复的事情,像这样:

//function to define constant
function custom_define ($const , $array) {
define($const, implode (',' , $array));
}


//function to access constant
function return_by_index ($index,$const = DEFAULT_ROLES) {
$explodedResult = explode(',' ,$const ) [$index];
if (isset ($explodedResult))
return explode(',' ,$const ) [$index] ;
}

希望这能有所帮助。快乐编码。

这就是我用的。它类似于soulmerge提供的示例,但是通过这种方式,您可以获得整个数组或数组中的单个值。

class Constants {
private static $array = array(0 => 'apple', 1 => 'orange');


public static function getArray($index = false) {
return $index !== false ? self::$array[$index] : self::$array;
}
}

像这样使用它:

Constants::getArray(); // Full array
// OR
Constants::getArray(1); // Value of 1 which is 'orange'

您可以将其作为JSON字符串存储在常量中。从应用程序的角度来看,JSON在其他情况下也很有用。

define ("FRUITS", json_encode(array ("apple", "cherry", "banana")));
$fruits = json_decode (FRUITS);
var_dump($fruits);

使用某种ser/deser或encode/decode技巧看起来很难看,并且要求您在尝试使用常量时记住您到底做了什么。我认为class private static variable with accessor是一个不错的解决方案,但我会给你一个更好的。只要有一个返回常量数组定义的公共静态getter方法。这只需要最少的额外代码,并且数组定义不会被意外修改。

class UserRoles {
public static function getDefaultRoles() {
return array('guy', 'development team');
}
}


initMyRoles( UserRoles::getDefaultRoles() );

如果你真的想让它看起来像一个已定义的常量,你可以给它一个全大写的名字,但是记住在名字后面加上'()'括号会让人困惑。

class UserRoles {
public static function DEFAULT_ROLES() { return array('guy', 'development team'); }
}


//but, then the extra () looks weird...
initMyRoles( UserRoles::DEFAULT_ROLES() );

我认为您可以将方法设置为全局的,以便更接近您所要求的define()功能,但是无论如何您都应该限定常量名称并避免全局变量。

我知道这是一个有点老的问题,但这是我的解决方案:

<?php
class Constant {


private $data = [];


public function define($constant, $value) {
if (!isset($this->data[$constant])) {
$this->data[$constant] = $value;
} else {
trigger_error("Cannot redefine constant $constant", E_USER_WARNING);
}
}


public function __get($constant) {
if (isset($this->data[$constant])) {
return $this->data[$constant];
} else {
trigger_error("Use of undefined constant $constant - assumed '$constant'", E_USER_NOTICE);
return $constant;
}
}


public function __set($constant,$value) {
$this->define($constant, $value);
}


}
$const = new Constant;

我定义它是因为我需要在常量中存储对象和数组,所以我也安装了runkit到php,这样我就可以使$const变量超全局。

你可以将它作为$const->define("my_constant",array("my","values"));$const->my_constant = array("my","values");使用

要获取该值,只需调用$const->my_constant;

从PHP 5.6开始,你可以用const声明一个数组常量:

<?php
const DEFAULT_ROLES = array('guy', 'development team');

短语法也可以,正如你所期望的那样:

<?php
const DEFAULT_ROLES = ['guy', 'development team'];

如果你有PHP 7,你最终可以使用define(),就像你第一次尝试的那样:

<?php
define('DEFAULT_ROLES', array('guy', 'development team'));

你可以这样定义

define('GENERIC_DOMAIN',json_encode(array(
'gmail.com','gmail.co.in','yahoo.com'
)));


$domains = json_decode(GENERIC_DOMAIN);
var_dump($domains);

是的,你可以将数组定义为常量。从PHP 5.6以上开始,可以将常量定义为标量表达式,它也是可以定义一个数组常量。可以将常量定义为资源,但应该避免这样做,因为这会导致意想不到的结果。

<?php
// Works as of PHP 5.3.0
const CONSTANT = 'Hello World';
echo CONSTANT;


// Works as of PHP 5.6.0
const ANOTHER_CONST = CONSTANT.'; Goodbye World';
echo ANOTHER_CONST;


const ANIMALS = array('dog', 'cat', 'bird');
echo ANIMALS[1]; // outputs "cat"


// Works as of PHP 7
define('ANIMALS', array(
'dog',
'cat',
'bird'
));
echo ANIMALS[1]; // outputs "cat"
?>

引用这个链接

有一个快乐的编码。

PHP 7 +

从PHP 7开始,你可以只使用定义()函数来定义常量数组:

define('ANIMALS', [
'dog',
'cat',
'bird'
]);


echo ANIMALS[1]; // outputs "cat"

甚至可以与关联数组工作..例如在课堂上。

class Test {


const
CAN = [
"can bark", "can meow", "can fly"
],
ANIMALS = [
self::CAN[0] => "dog",
self::CAN[1] => "cat",
self::CAN[2] => "bird"
];


static function noParameter() {
return self::ANIMALS[self::CAN[0]];
}


static function withParameter($which, $animal) {
return "who {$which}? a {$animal}.";
}


}


echo Test::noParameter() . "s " . Test::CAN[0] . ".<br>";
echo Test::withParameter(
array_keys(Test::ANIMALS)[2], Test::ANIMALS["can fly"]
);


// dogs can bark.
// who can fly? a bird.

如果您是从2009年开始看这个,并且不喜欢AbstractSingletonFactoryGenerators,那么这里有一些其他选项。

记住,数组在赋值时被“复制”,或者在本例中被返回,因此实际上每次都得到相同的数组。(参见PHP中数组的写时复制行为。)

function FRUITS_ARRAY(){
return array('chicken', 'mushroom', 'dirt');
}


function FRUITS_ARRAY(){
static $array = array('chicken', 'mushroom', 'dirt');
return $array;
}


function WHAT_ANIMAL( $key ){
static $array = (
'Merrick' => 'Elephant',
'Sprague' => 'Skeleton',
'Shaun'   => 'Sheep',
);
return $array[ $key ];
}


function ANIMAL( $key = null ){
static $array = (
'Merrick' => 'Elephant',
'Sprague' => 'Skeleton',
'Shaun'   => 'Sheep',
);
return $key !== null ? $array[ $key ] : $array;
}

如果你使用的是PHP 7 &7+,你也可以像这样使用fetch

define('TEAM', ['guy', 'development team']);
echo TEAM[0];
// output from system will be "guy"