programing

PHP | define() vs. const.

bestcode 2023. 1. 21. 09:47
반응형

PHP | define() vs. const.

PHP에서는 다음 두 가지 방법으로 상수를 선언할 수 있습니다.

  1. ★★★★★★★★★★★★★★★★ define(키워드)

    define('FOO', 1);
    
  2. 「」를 사용합니다.const(키워드)

    const FOO = 1;
    

  • 그 둘의 주된 차이점은 무엇입니까?
  • 언제, 왜 하나를 사용해야 하며 다른 하나를 사용해야 합니까?

PHP 5.3에서 상수를 정의하는 방법은 두 가지가 있습니다.둘 중 하나를 사용하여const키워드를 지정하거나 다음 함수를 사용합니다.

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

두 는 '이러한 방법'이라는 입니다.const시 , 는 컴파일 시에 상수를 정의합니다.define실행 시 정의합니다.은 대부분의 .const의점 someagesagesagesconst과 같습니다

  • const상수를 조건부로 정의하는 데 사용할 수 없습니다.글로벌 상수를 정의하려면 가장 바깥쪽 범위에서 사용해야 합니다.

     if (...) {
         const FOO = 'BAR';    // Invalid
     }
     // but
     if (...) {
         define('FOO', 'BAR'); // Valid
     }
    

    어쨌든 왜 그러려고 하는 거야?일반적인 응용 프로그램 중 하나는 상수가 이미 정의되어 있는지 확인하는 것입니다.

     if (!defined('FOO')) {
         define('FOO', 'BAR');
     }
    
  • const는, 스태틱 숫자,, 「」, 「문자열」등의 .true,false,null,__FILE__에 비해, 。define()어떤 식으로든 표현합니다. 5.5.6 표현이 const아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아.

     const BIT_5 = 1 << 5;    // Valid since PHP 5.6 and invalid previously
     define('BIT_5', 1 << 5); // Always valid
    
  • const이름을 , 에는 상수가 붙습니다.define()는 임의의 식을 이름으로 받아들입니다.이를 통해 다음과 같은 작업을 수행할 수 있습니다.

     for ($i = 0; $i < 32; ++$i) {
         define('BIT_' . $i, 1 << $i);
     }
    
  • const만, 「대소문자를 구분합니다.」는, 「대소문자를 구분합니다.define() 상수를 할 수 있습니다.true 인수하지 않는 의 정의는 7.0 0

     define('FOO', 'BAR', true);
     echo FOO; // BAR
     echo foo; // BAR
    

그래서 그게 나쁜 점이었군요. 제가 으로 항상 const위의 상황 중 하나가 발생하지 않는 한

  • const단순히 더 잘 읽힌다.함수가 아닌 언어 구성이며 클래스의 상수를 정의하는 방법과 일치합니다.

  • const자동 툴링으로 정적 분석할 수 있습니다.

  • const 네임스페이스에.define()완전한 네임스페이스 이름을 전달해야 합니다.

     namespace A\B\C;
     // To define the constant A\B\C\FOO:
     const FOO = 'BAR';
     define('A\B\C\FOO', 'BAR');
    
  • 5.6 5.6 const이 될 , 상수는 배열이 될 수도 있습니다.define()는 아직 어레이를 지원하지 않습니다. 7ada, PHP 7의 경우, PHP 7의 경우 됩니다.

     const FOO = [1, 2, 3];    // Valid in PHP 5.6
     define('FOO', [1, 2, 3]); // Invalid in PHP 5.6 and valid in PHP 7.0
    

주의해 .const클래스 또는 인터페이스 내에서 클래스 상수 또는 인터페이스 상수를 정의하기 위해서도 사용할 수 있습니다. define할 수 없습니다.

class Foo {
    const BAR = 2; // Valid
}
// But
class Baz {
    define('QUX', 2); // Invalid
}

요약

정의 정의가 한 경우를 하고, 「」를 합니다.const해 주세요.define()- !s - 히가가가 s s!

까지는 PHP 5.3이었습니다.const글로벌 범위에서 사용할 수 없습니다.이것은 클래스 내에서만 사용할 수 있습니다.이 옵션은 해당 클래스와 관련된 일정한 옵션 또는 설정을 설정할 때 사용해야 합니다.또는 어떤 열거형을 만들고 싶을 수도 있습니다.

define는 같은 목적으로 사용할 수 있지만 글로벌 범위에서만 사용할 수 있습니다.애플리케이션 전체에 영향을 주는 글로벌 설정에만 사용해야 합니다.

const사용법은 마법의 숫자를 없애는 것이다.PDO의 상수를 살펴봅니다.가져오기 유형을 지정해야 할 경우 다음과 같이 입력합니다.PDO::FETCH_ASSOC const를 const를 35 무엇이든)FETCH_ASSOC라고 정의됩니다).이것은 독자들에게는 의미가 없다.

define사용 방법은 응용 프로그램의 루트 경로 또는 라이브러리의 버전 번호를 지정하는 것일 수 있습니다.

이미 답변이 끝난 것은 알지만, 현재 답변에서는 네임스페이스와 그것이 상수와 정의에 어떻게 영향을 미치는지에 대해 언급하지 않았습니다.

PHP 5.3에서 const와 definition은 대부분의 점에서 유사합니다.그러나 다음과 같은 몇 가지 중요한 차이가 있습니다.

  • 일정하게 하다 const FOO = 4 * 3;하지 define('CONST', 4 * 3);
  • 이름이 전달되었습니다.define에는 해당 네임스페이스 내에 정의할 네임스페이스를 포함해야 합니다.

다음 코드는 차이점을 나타냅니다.

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)를 정의할 수 있습니다., 이 56:,, 다 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;

아직 안 나왔을 거예요.

define글로벌 상수에 사용합니다.

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

수 없다define 「」를 지정하면, 「」가 됩니다.const넌넌할수있있있있 。

,과 함께,const는 실제로, 「」에서는 「」를 사용해 주세요define글로벌 범위로 푸시됩니다.

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

NikiC의 답변이 가장 좋지만, 네임스페이스를 사용할 때 예기치 않은 행동을 하지 않도록 눈에 띄지 않는 주의사항을 추가하겠습니다.주의할 점은 정의 ID의 일부로 이름 공간을 명시적으로 추가하지 않는 한 정의는 항상 글로벌 이름 공간에 있다는 것입니다.이에 대해 명확하지 않은 것은 이름 앞에 있는 식별자가 글로벌 식별자를 능가한다는 것이다.따라서:

<?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라는 개념은 코드 내 어디에 있든 항상 동일하며 PHP는 이를 보증하지 않기 때문에 이 모든 개념을 불필요하게 혼란스럽게 만듭니다.

이 답변의 대부분은 틀렸거나 이야기의 절반만 말하고 있다.

  1. 네임스페이스를 사용하여 상수의 범위를 지정할 수 있습니다.
  2. 클래스 정의 외부에서 "const" 키워드를 사용할 수 있습니다.단, 클래스에서와 마찬가지로 "const" 키워드를 사용하여 할당되는 값은 상수 표현식이어야 합니다.

예를 들어 다음과 같습니다.

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

예, const는 컴파일 시 정의되며 nikic 상태는 define()의 경우와 같이 식을 할당할 수 없습니다.단, const는 (같은 이유로) 조건부로 선언할 수 없습니다.즉, 이 조작은 할 수 없습니다.

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

define()을 사용하여 정의할 수 있습니다.그래서 그것은 개인적인 선호로 귀결되는 것이 아니라 두 가지 모두를 사용하는 옳고 그름의 방법이 있다.

옆자리로서...표현식을 할당할 수 있는 클래스 상수나 클래스로 분리할 수 있는 define()을 보고 싶습니다.

니키치 const는 클래스 내에서과 같이 할 수 .

class Foo {
    const BAR = 1;

    public function myMethod() {
        return self::BAR;
    }
}

안 요.define().

언급URL : https://stackoverflow.com/questions/2447791/php-define-vs-const

반응형