这失败了:
define('DEFAULT_ROLES', array('guy', 'development team'));
显然,常量不能保存数组。解决此问题的最佳方法是什么?
define('DEFAULT_ROLES', 'guy|development team');
//...
$default = explode('|', DEFAULT_ROLES);
这似乎是不必要的努力。
这失败了:
define('DEFAULT_ROLES', array('guy', 'development team'));
显然,常量不能保存数组。解决此问题的最佳方法是什么?
define('DEFAULT_ROLES', 'guy|development team');
//...
$default = explode('|', DEFAULT_ROLES);
这似乎是不必要的努力。
Answers:
注意:虽然这是公认的答案,但值得注意的是,在PHP 5.6+中,您可以拥有const数组- 请参见下面的Andrea Faulds的答案。
您还可以序列化数组,然后将其放入常量中:
# define constant, serialize array
define ("FRUITS", serialize (array ("apple", "cherry", "banana")));
# use it
$my_fruits = unserialize (FRUITS);
$fruit = FRUITS[0];
从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()
在PHP 5.6中使用,但这已在PHP 7.0中修复。:)
您可以将它们存储为类的静态变量:
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';
如果您不喜欢其他人可以更改数组的想法,那么使用吸气剂可能会有所帮助:
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'];
const AtomicValue =42; public static $fooArray = ('how','di')
我正在这样使用它。希望对别人有帮助。
config.php
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'));
这就是我用的。它类似于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);
我知道这是一个有点老的问题,但这是我的解决方案:
<?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变量成为superglobal。
您可以将其用作$const->define("my_constant",array("my","values"));
或$const->my_constant = array("my","values");
要获得价值,只需致电 $const->my_constant;
__get
和__set
...我必须说,这种方法是伟大的。
甚至可以在类中使用关联数组。
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.
使用爆炸和内爆功能,我们可以即兴解决方案:
$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] ;
}
希望能有所帮助。快乐的编码。
做某种Ser / Deser或编码/解码技巧似乎很丑陋,并且要求您记住尝试使用该常数时所执行的操作。我认为带访问器的类私有静态变量是一个不错的解决方案,但我会做得更好。只需有一个公共静态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 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"
?>
参考此链接
祝您编码愉快。
如果您从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;
}
常量只能包含标量值,建议您存储数组的序列化(或JSON编码表示形式)。