PHP | define() vs. const.
PHP에서는 다음 두 가지 방법으로 상수를 선언할 수 있습니다.
★★★★★★★★★★★★★★★★
define
(키워드)define('FOO', 1);
「」를 사용합니다.
const
(키워드)const FOO = 1;
- 그 둘의 주된 차이점은 무엇입니까?
- 언제, 왜 하나를 사용해야 하며 다른 하나를 사용해야 합니까?
PHP 5.3에서 상수를 정의하는 방법은 두 가지가 있습니다.둘 중 하나를 사용하여const
키워드를 지정하거나 다음 함수를 사용합니다.
const FOO = 'BAR';
define('FOO', 'BAR');
두 는 '이러한 방법'이라는 입니다.const
시 , 는 컴파일 시에 상수를 정의합니다.define
실행 시 정의합니다.은 대부분의 .const
의점 someagesagesages의 몇 const
과 같습니다
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 0define('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는 이를 보증하지 않기 때문에 이 모든 개념을 불필요하게 혼란스럽게 만듭니다.
이 답변의 대부분은 틀렸거나 이야기의 절반만 말하고 있다.
- 네임스페이스를 사용하여 상수의 범위를 지정할 수 있습니다.
- 클래스 정의 외부에서 "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
'programing' 카테고리의 다른 글
팬더 데이터 프레임 목록 연결 (0) | 2023.01.21 |
---|---|
MySQL 문자열에서 영숫자가 아닌 모든 문자를 제거하려면 어떻게 해야 합니까? (0) | 2023.01.21 |
스크립트 언어(Perl, Python, Ruby 등)가 셸 언어로 적합하지 않은 이유는 무엇입니까? (0) | 2023.01.21 |
마리아답:WHERE 절에서 창 함수 LAG 결과 사용 (0) | 2023.01.15 |
PHP에서 닫힘...정확히 무엇을 언제 사용할 필요가 있는가? (0) | 2023.01.15 |