실패했습니다 :
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);
이것은 불필요한 노력처럼 보입니다.
답변:
참고 : 이것은 정답이지만 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';
다른 사람이 배열을 변경할 수 있다는 생각이 마음에 들지 않으면 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'];
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 5.6부터 다음과 const
같은 키워드를 사용하여 상수 배열을 정의 할 수 있습니다
const DEFAULT_ROLES = ['test', 'development', 'team'];
다음과 같이 다른 요소에 액세스 할 수 있습니다.
echo DEFAULT_ROLES[1];
....
PHP 7부터는 다음과 같이 상수 배열을 정의 할 수 있습니다 define
.
define('DEFAULT_ROLES', [
'test',
'development',
'team'
]);
이전과 같은 방식으로 다른 요소에 액세스 할 수 있습니다.
나는 그것이 오래된 질문이라는 것을 알고 있지만 여기 내 해결책이 있습니다.
<?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;
객체와 배열을 상수로 저장해야했기 때문에 $ const 변수를 superglobal으로 만들 수 있도록 php에 runkit을 설치했기 때문에 정의했습니다.
그대로 $const->define("my_constant",array("my","values"));
또는 그대로 사용할 수 있습니다$const->my_constant = array("my","values");
값을 얻으려면 단순히 전화하십시오. $const->my_constant;
__get
그리고 __set
나는이 방법이 좋은 것을 말해야한다 ....
예를 들어 클래스에서 Associative Arrays와 함께 사용할 수도 있습니다.
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.
explode 및 implode 기능을 사용하여 솔루션을 즉흥적으로 개선 할 수 있습니다.
$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 또는 encode / decode 트릭을 수행하는 것은 추악한 것처럼 보이며 상수를 사용하려고 할 때 정확히 한 일을 기억해야합니다. 접근자가있는 클래스 전용 정적 변수는 괜찮은 해결책이라고 생각하지만 더 잘 할 것입니다. 상수 배열의 정의를 반환하는 공개 정적 게터 메소드 만 있으면됩니다. 이를 위해서는 최소한의 추가 코드가 필요하며 실수로 배열 정의를 수정할 수 없습니다.
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 인코딩 표현)를 저장하는 것이 좋습니다.