복붙노트

define ()과 const

PHP

define ()과 const

아주 간단한 질문 : PHP에서는 언제 사용합니까?

define('FOO', 1);

언제 사용합니까?

const FOO = 1;

이 둘의 주요 차이점은 무엇입니까?

해결법

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

    1.PHP 5.3에서 상수를 정의하는 두 가지 방법이 있습니다 : const 키워드를 사용하거나 define () 함수를 사용하십시오 :

    PHP 5.3에서 상수를 정의하는 두 가지 방법이 있습니다 : const 키워드를 사용하거나 define () 함수를 사용하십시오 :

    const FOO = 'BAR';
    define('FOO', 'BAR');
    

    두 가지 방법의 근본적인 차이점은 const는 컴파일 타임에 상수를 정의하는 반면 define은 런타임에 상수를 정의한다는 것입니다. 이로 인해 const의 단점이 대부분 발생합니다. const의 몇 가지 단점은 다음과 같습니다.

    그래서 그것은 사물의 나쁜 측면이었습니다. 이제 위의 상황 중 하나가 발생하지 않는 한 개인적으로 항상 const를 사용하는 이유를 살펴 보겠습니다.

    마지막으로, 클래스 또는 인터페이스 내에서 const를 사용하여 클래스 상수 또는 인터페이스 상수를 정의 할 수도 있습니다. define은이 목적을 위해 사용될 수 없다 :

    class Foo {
        const BAR = 2; // valid
    }
    // but
    class Baz {
        define('QUX', 2); // invalid
    }
    

    개요

    어떤 타입의 조건부 또는 표현식 정의가 필요하지 않다면, 단지 read ()의 대신 const ()를 사용하십시오!

  2. ==============================

    2.PHP 5.3까지 const는 전역 범위에서 사용할 수 없었습니다. 당신은 수업 내에서만 이것을 사용할 수 있습니다. 어떤 종류의 상수 옵션이나 해당 클래스와 관련된 설정을 지정하려는 경우이 옵션을 사용해야합니다. 또는 어떤 종류의 enum을 만들고 싶을 수도 있습니다.

    PHP 5.3까지 const는 전역 범위에서 사용할 수 없었습니다. 당신은 수업 내에서만 이것을 사용할 수 있습니다. 어떤 종류의 상수 옵션이나 해당 클래스와 관련된 설정을 지정하려는 경우이 옵션을 사용해야합니다. 또는 어떤 종류의 enum을 만들고 싶을 수도 있습니다.

    define은 동일한 목적으로 사용될 수 있지만 전역 범위에서만 사용할 수 있습니다. 전체 응용 프로그램에 영향을주는 전역 설정에만 사용해야합니다.

    좋은 const 사용법의 예는 매직 넘버를 제거하는 것입니다. PDO의 상수를 살펴보십시오. 반입 유형을 지정해야하는 경우, 예를 들어 PDO :: FETCH_ASSOC을 입력하십시오. const가 사용되지 않으면, 35와 같이 (또는 FETCH_ASSOC가 정의 된 것과 같이) 타이핑 할 것이다. 이것은 독자에게 이해가되지 않습니다.

    좋은 정의 사용의 예로는 응용 프로그램의 루트 경로 또는 라이브러리의 버전 번호를 지정하는 것입니다.

  3. ==============================

    3.나는 이것이 이미 답변 된 것을 알고 있지만, 현재의 대답들 중 어느 것도 네임 스페이스에 대한 언급을하지 않으며 그것이 상수와 정의에 어떻게 영향을 미치는지에 대해 언급하지 않습니다.

    나는 이것이 이미 답변 된 것을 알고 있지만, 현재의 대답들 중 어느 것도 네임 스페이스에 대한 언급을하지 않으며 그것이 상수와 정의에 어떻게 영향을 미치는지에 대해 언급하지 않습니다.

    PHP 5.3에서 const와 정의는 대부분 비슷한 점이 있습니다. 그러나 여전히 몇 가지 중요한 차이점이 있습니다.

    아래 코드는 차이점을 설명합니다.

    namespace foo 
    {
        const BAR = 1;
        define('BAZ', 2);
        define(__NAMESPACE__ . '\\BAZ', 3);
    }
    
    namespace {
        var_dump(get_defined_constants(true));
    }
    

    사용자 하위 배열의 내용은 [ 'foo \\ BAR'=> 1, 'BAZ'=> 2, 'foo \\ BAZ'=> 3]입니다.

    === 업데이트 ===

    곧 출시 될 PHP 5.6에서는 const를 사용하여 좀 더 유연하게 사용할 수 있습니다. 표현식이 다른 const 나 리터럴로 구성된다면 표현식으로 const를 정의 할 수 있습니다. 즉, 다음은 5.6에서 유효해야합니다.

    const FOOBAR = 'foo ' . 'bar';
    const FORTY_TWO = 6 * 9; // For future editors: THIS IS DELIBERATE! Read the answer comments below for more details
    const ULTIMATE_ANSWER = 'The ultimate answer to life, the universe and everything is ' . FORTY_TWO;
    

    당신은 여전히 ​​변수 나 함수의 관점에서 const를 정의 할 수 없을 것이다.

    const RND = mt_rand();
    const CONSTVAR = $var;
    

    여전히 꺼져있을거야.

  4. ==============================

    4.필자는 PHP 5.3에서 두 번째 예제와 같이 클래스 외부에서 const를 사용할 수 있다고 생각합니다.

    필자는 PHP 5.3에서 두 번째 예제와 같이 클래스 외부에서 const를 사용할 수 있다고 생각합니다.

    http://www.php.net/manual/en/language.constants.syntax.php

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

    5.내가 전역 상수에 사용하도록 정의하십시오.

    내가 전역 상수에 사용하도록 정의하십시오.

    내가 클래스 상수에 사용합니다.

    클래스 범위와 const를 정의 할 수는 없습니다. 말할 필요도없이, 당신은 const 클래스 범위 밖에서 const를 사용할 수 없다.

    또한, const를 사용하면 클래스의 멤버가되고 define을 통해 전역 범위로 푸시됩니다.

  6. ==============================

    6.NikiC의 대답은 최고이지만, 예기치 않은 동작으로 인해 잡히지 않도록 네임 스페이스를 사용할 때 명백하지 않은 경고를 추가하겠습니다. 기억해야 할 점은 정의 식별자의 일부로 명시 적으로 네임 스페이스를 추가하지 않는 한 정의가 전역 네임 스페이스에 항상 있음을 기억하는 것입니다. 확실하지 않은 점은 이름 공간 식별자가 전역 식별자보다 우선한다는 점입니다. 그래서 :

    NikiC의 대답은 최고이지만, 예기치 않은 동작으로 인해 잡히지 않도록 네임 스페이스를 사용할 때 명백하지 않은 경고를 추가하겠습니다. 기억해야 할 점은 정의 식별자의 일부로 명시 적으로 네임 스페이스를 추가하지 않는 한 정의가 전역 네임 스페이스에 항상 있음을 기억하는 것입니다. 확실하지 않은 점은 이름 공간 식별자가 전역 식별자보다 우선한다는 점입니다. 그래서 :

    <?php
    namespace foo
    {
      // Note: when referenced in this file or namespace, the const masks the defined version
      // this may not be what you want/expect
      const BAR = 'cheers';
      define('BAR', 'wonka');
    
      printf("What kind of bar is a %s bar?\n", BAR);
    
      // To get to the define in the global namespace you need to explicitely reference it
      printf("What kind of bar is a %s bar?\n", \BAR);
    }
    
    namespace foo2
    {
      // But now in another namespace (like in the default) the same syntax calls up the 
      // the defined version!
      printf("Willy %s\n", BAR);
      printf("three %s\n", \foo\BAR);  
    }
    ?>
    

    생산 :

    What kind of bar is a cheers bar? 
    What kind of bar is a wonka bar?
    willy wonka 
    three cheers
    

    다른 언어에서 수십 가지 const의 아이디어가 있기 때문에 나에게 항상 const 개념을 혼란스럽게 만드는 것은 당신이 코드에있는 모든 것이 동일하고, PHP가 실제로 그것을 보장하지 않는다는 것입니다.

  7. ==============================

    7.이 답변의 대부분은 잘못되었거나 이야기의 절반 만 전달합니다.

    이 답변의 대부분은 잘못되었거나 이야기의 절반 만 전달합니다.

    예 :

    const AWESOME = 'Bob'; // Valid
    

    나쁜 예 :

    const AWESOME = whatIsMyName(); // Invalid (Function call)
    const WEAKNESS = 4+5+6; // Invalid (Arithmetic) 
    const FOO = BAR . OF . SOAP; // Invalid (Concatenation)
    

    변수 상수를 생성하려면 define ()을 다음과 같이 사용하십시오 :

    define('AWESOME', whatIsMyName()); // Valid
    define('WEAKNESS', 4 + 5 + 6); // Valid
    define('FOO', BAR . OF . SOAP); // Valid
    
  8. ==============================

    8.예, const는 컴파일 타임에 정의되며, nikic states에는 식을 할당 할 수 없으므로 define ()의 수 있습니다. 하지만 const의 조건부 선언은 동일하지 않습니다. 즉. 너는 이것을 못해:

    예, const는 컴파일 타임에 정의되며, nikic states에는 식을 할당 할 수 없으므로 define ()의 수 있습니다. 하지만 const의 조건부 선언은 동일하지 않습니다. 즉. 너는 이것을 못해:

    if (/* some condition */) {
      const WHIZZ = true;  // CANNOT DO THIS!
    }
    

    반면에 define ()을 사용하면됩니다. 그래서, 그것은 개인적 선호에 정말로 미치지 못합니다. 둘 다 사용하는 올바른 방법과 잘못된 방법이 있습니다.

    옆으로 ... 나는 클래스에 격리 될 수있는 일종의 define ()과 같은 표현식을 할당 할 수있는 일종의 클래스 const를보고 싶습니다.

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

    9.NikiC의 답변에 추가하십시오. const는 다음과 같은 방식으로 클래스 내에서 사용될 수 있습니다 :

    NikiC의 답변에 추가하십시오. const는 다음과 같은 방식으로 클래스 내에서 사용될 수 있습니다 :

    class Foo {
        const BAR = 1;
    
        public function myMethod() {
            return self::BAR;
        }
    }
    

    define ()을 사용하여이 작업을 수행 할 수 없습니다.

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

    10.아무도 php-doc에 관해서 아무 말도하지 않지만 저에게는 const의 선호에 대한 매우 중요한 논거이기도합니다 :

    아무도 php-doc에 관해서 아무 말도하지 않지만 저에게는 const의 선호에 대한 매우 중요한 논거이기도합니다 :

    /**
     * My foo-bar const
     * @var string
     */
    const FOO = 'BAR';
    
  11. from https://stackoverflow.com/questions/2447791/define-vs-const by cc-by-sa and MIT license