복붙노트

배열을 포함하는 PHP 상수?

PHP

배열을 포함하는 PHP 상수?

실패 :

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

분명히 상수는 배열을 가질 수 없습니다. 이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

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

//...

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

이것은 불필요한 노력처럼 보입니다.

해결법

  1. ==============================

    1.참고 : 이것은 받아 들인 대답이지만, PHP 5.6 이상에서는 const 배열을 사용할 수 있습니다. 아래의 Andrea Faulds의 대답을 참조하십시오.

    참고 : 이것은 받아 들인 대답이지만, PHP 5.6 이상에서는 const 배열을 사용할 수 있습니다. 아래의 Andrea Faulds의 대답을 참조하십시오.

    배열을 직렬화 한 다음 상수에 넣을 수도 있습니다.

    # define constant, serialize array
    define ("FRUITS", serialize (array ("apple", "cherry", "banana")));
    
    # use it
    $my_fruits = unserialize (FRUITS);
    
  2. ==============================

    2.PHP 5.6 이후로 const로 배열 상수를 선언 할 수 있습니다 :

    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'));
    
  3. ==============================

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

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

    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'];
    
  4. ==============================

    4.나는 이것을 이렇게 사용하고있다. 나는 그것이 다른 사람들을 도울 것이라고 희망한다.

    나는 이것을 이렇게 사용하고있다. 나는 그것이 다른 사람들을 도울 것이라고 희망한다.

    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'));
    
  5. ==============================

    5.이것이 내가 사용하는 것입니다. soulmerge에서 제공하는 예제와 비슷하지만이 방법을 사용하면 전체 배열 또는 배열의 단일 값을 가져올 수 있습니다.

    이것이 내가 사용하는 것입니다. 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'
    
  6. ==============================

    6.상수에 JSON 문자열로 저장할 수 있습니다. 또한 애플리케이션 관점에서 볼 때 JSON은 다른 경우에 유용 할 수 있습니다.

    상수에 JSON 문자열로 저장할 수 있습니다. 또한 애플리케이션 관점에서 볼 때 JSON은 다른 경우에 유용 할 수 있습니다.

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

    7.PHP 5.6부터 아래처럼 const 키워드를 사용하여 상수 배열을 정의 할 수 있습니다

    PHP 5.6부터 아래처럼 const 키워드를 사용하여 상수 배열을 정의 할 수 있습니다

    const DEFAULT_ROLES = ['test', 'development', 'team'];
    

    다음과 같이 다른 요소에 액세스 할 수 있습니다.

    echo DEFAULT_ROLES[1]; 
    ....
    

    PHP 7부터 상수 배열은 다음과 같이 define을 사용하여 정의 할 수 있습니다.

    define('DEFAULT_ROLES', [
        'test',
        'development',
        'team'
    ]);
    

    이전과 같은 방식으로 다른 요소에 액세스 할 수 있습니다.

  8. ==============================

    8.나는 그것이 약간 오래된 질문이라는 것을 알고 있지만, 여기에 내 해결책이있다.

    나는 그것이 약간 오래된 질문이라는 것을 알고 있지만, 여기에 내 해결책이있다.

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

    객체와 배열을 상수에 저장해야하기 때문에 PHP를 runkit으로 설치하여 $ const 변수를 전역 변수로 만들 수 있었기 때문에이 함수를 정의했습니다.

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

    값을 얻으려면 $ const-> my_constant를 호출하면됩니다.

  9. ==============================

    9.폭발 및 함몰 함수를 사용하여 우리는 솔루션을 즉석에서 만들 수 있습니다.

    폭발 및 함몰 함수를 사용하여 우리는 솔루션을 즉석에서 만들 수 있습니다.

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

    그러면 이메일이 전송됩니다.

    더 많이 최적화하고 싶다면 다음과 같이 반복적 인 일을하는 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] ;
    }
    

    희망이 도움이됩니다. 행복한 코딩.

  10. ==============================

    10.ser / deser 또는 encode / decode 트릭의 일종을하는 것은보기 흉한 것처럼 보이고 상수를 사용하려고 할 때 정확히 무엇을했는지 기억해야합니다. 접근자를 가진 클래스 개인 정적 변수는 괜찮은 해결책이라고 생각합니다. 상수 배열의 정의를 반환하는 공용 정적 getter 메서드가 있습니다. 이렇게하려면 최소한의 추가 코드가 필요하며 배열 정의를 실수로 수정할 수 없습니다.

    ser / deser 또는 encode / decode 트릭의 일종을하는 것은보기 흉한 것처럼 보이고 상수를 사용하려고 할 때 정확히 무엇을했는지 기억해야합니다. 접근자를 가진 클래스 개인 정적 변수는 괜찮은 해결책이라고 생각합니다. 상수 배열의 정의를 반환하는 공용 정적 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 () 함수에 더 가깝도록 메소드를 전역으로 만들 수 있다고 생각하지만, 어쨌든 상수 이름의 범위를 지정하고 전역을 피하는 것이 좋습니다.

  11. ==============================

    11.이처럼 정의 할 수 있습니다.

    이처럼 정의 할 수 있습니다.

    define('GENERIC_DOMAIN',json_encode(array(
        'gmail.com','gmail.co.in','yahoo.com'
    )));
    
    $domains = json_decode(GENERIC_DOMAIN);
    var_dump($domains);
    
  12. ==============================

    12.예, 배열을 상수로 정의 할 수 있습니다. PHP 5.6부터 상수를 스칼라 표현식으로 정의 할 수 있으며 배열 상수를 정의 할 수도 있습니다. 상수를 자원으로 정의 할 수는 있지만 예상치 못한 결과가 발생할 수 있으므로 피해야합니다.

    예, 배열을 상수로 정의 할 수 있습니다. 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"
    ?>
    

    이 링크의 참조

    행복한 코딩을하십시오.

  13. ==============================

    13.상수는 스칼라 값만 포함 할 수 있습니다. 배열의 직렬화 (또는 JSON으로 인코딩 된 표현)를 저장하는 것이 좋습니다.

    상수는 스칼라 값만 포함 할 수 있습니다. 배열의 직렬화 (또는 JSON으로 인코딩 된 표현)를 저장하는 것이 좋습니다.

  14. ==============================

    14.예를 들어 클래스에서 Associative Arrays ..와 같이 작업 할 수 있습니다.

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

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

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

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

  16. ==============================

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

    PHP 7에서 define () 함수를 사용하여 상수 배열을 정의 할 수 있습니다 :

    define('ANIMALS', [
        'dog',
        'cat',
        'bird'
    ]);
    
    echo ANIMALS[1]; // outputs "cat"
    
  17. ==============================

    17.

    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);
    
  18. ==============================

    18.배열을 일련의 상수로 분해 할 수도 있습니다. (꽤 오래된 학교 솔루션) 어쨌든 배열은 상수이기 때문에 필요로하는 유일한 이유는 전역적이고 빠르며 특정 키를 조회하는 것입니다.

    배열을 일련의 상수로 분해 할 수도 있습니다. (꽤 오래된 학교 솔루션) 어쨌든 배열은 상수이기 때문에 필요로하는 유일한 이유는 전역적이고 빠르며 특정 키를 조회하는 것입니다.

    그러므로 이것 :

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

    다음으로 바뀔 것입니다 :

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

    예, 네임 스페이스 오염 (그리고 그것을 막기위한 접두사가 많이 있습니다)이 고려되었습니다.

  19. ==============================

    19.그건 맞습니다, 당신은 상수에 대한 배열을 사용할 수 없으며 scaler와 null 만 사용할 수 있습니다. 상수에 대한 배열을 사용한다는 생각은 나에게 조금 뒤떨어져 보입니다.

    그건 맞습니다, 당신은 상수에 대한 배열을 사용할 수 없으며 scaler와 null 만 사용할 수 있습니다. 상수에 대한 배열을 사용한다는 생각은 나에게 조금 뒤떨어져 보입니다.

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

  20. from https://stackoverflow.com/questions/1290318/php-constants-containing-arrays by cc-by-sa and MIT license