Programing

배열을 포함하는 PHP 상수?

lottogame 2020. 2. 25. 22:10
반응형

배열을 포함하는 PHP 상수?


실패했습니다 :

 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);

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'));

클래스의 정적 변수로 저장할 수 있습니다.

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 이상을 사용하는 경우 Andrea Faulds 답변을 사용하십시오.

나는 이것을 이렇게 사용하고 있습니다. 다른 사람들을 도울 것입니다.

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으로 만들 수 있도록 runkit을 PHP에 설치했기 때문에 정의했습니다.

그대로 $const->define("my_constant",array("my","values"));또는 그대로 사용할 수 있습니다$const->my_constant = array("my","values");

값을 얻으려면 단순히 전화하십시오. $const->my_constant;


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 () 기능에 더 가깝게 만들 수 있다고 가정하지만 실제로 상수 이름의 범위를 지정하고 전역을 피해야합니다.


이렇게 정의 할 수 있습니다

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

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

PHP 7 이상

PHP 7부터 define () 함수를 사용하여 상수 배열을 정의 할 수 있습니다.

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

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

예를 들어 클래스에서 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.

예, 배열을 상수로 정의 할 수 있습니다. 에서 전방 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 인코딩 표현)를 저장하는 것이 좋습니다.


PHP 7 및 7 이상을 사용하는 경우 이와 같이 가져 오기를 사용할 수 있습니다

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

나는 eyze에 동의합니다. 상수는 응용 프로그램의 전체 수명에 필요한 단일 값입니다. 이런 종류의 상수 대신 구성 파일을 사용하는 것을 생각할 수 있습니다.

상수 배열이 실제로 필요한 경우 명명 규칙을 사용하여 배열을 다소 모방 할 수 있습니다 (예 : DB_Name, DB_USER, DB_HOST 등).


맞습니다. 상수, 스케일러 및 null에만 배열을 사용할 수 없습니다. 상수에 배열을 사용한다는 생각은 조금 뒤바뀐 것 같습니다.

대신 내가 제안하는 것은 자신의 상수 클래스를 정의하고 상수를 얻는 데 사용하는 것입니다.


define('MY_ARRAY_CONSTANT_DELIMETER', '|');       
define('MY_ARRAY',implode(MY_ARRAY_CONSTANT_DELIMETER,array(1,2,3,4)));

//retrieving the array
$my_array = explode(MY_ARRAY_CONSTANT_DELIMETER, MY_ARRAY);

배열을 일련의 상수로 분해 할 수도 있습니다. (꽤 오래된 학교 솔루션) 결국 배열은 일정 하므로 필요한 유일한 이유는 전역적이고 빠르며 특정 키를 찾는 것 입니다.

따라서 이것은 :

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

로 변할 것입니다 :

define('DEFAULT_ROLES_0', 'guy');
define('DEFAULT_ROLES_1', 'development team');

예, 네임 스페이스 오염과이를 방지하기위한 많은 접두사가 있습니다.

참고 URL : https://stackoverflow.com/questions/1290318/php-constants-include-arrays



반응형