본문 바로가기

php 헛다리/php etc 헛다리

php 상수

728x90

상수는 단순한 값을 위한 식별자(이름)이다. 이름이 제시하는것과 같이, 이 값은 스크립트 실행중에는 변경될수 없다. (실질적으로 상수가 아닌 마법 상수 을 제외하고) 상수는 기본적으로 대소문자를 구별한다. 관례상, 상수 식별자는 항상 대문자이다.

PHP에서 상수명은 같은 규칙을 따른다. 유효한 상수명은 문자나 밑줄로 시작하고 다른 문자나 숫자, 밑줄이 뒤를 따른다. 정규식으로는 다음처럼 표현할수 있다: [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*

define() 함수를 사용해서 상수를 정의할 수 있습니다. PHP 5.3.0부터 클래스 정의 밖에서 const 키워드를 사용할 수도 있습니다.

상수가 한번 정의되면, 변경하거나 해제(undefine)할 수 없습니다.

PHP 5.6 이전에는 스칼라 데이터(boolean, integer, float and string)만 상수로 등록할 수 있습니다.

5.6 이후에는 스칼라 표현식을 상수로 정의할 수 있고, array 또한 등록할 수 있습니다.

또, resource를 상수로 정의할 수는 있지만 예상치 못한 문제를 야기할 수 있으므로 사용하지 않을 것을 권고합니다.

단순히 상수명을 써서 상수값을 얻을 수 있다.

변수와는 달리 $가 상수명 앞으로 오면 안된다 동적으로 상수명을 취하려한다면 constant()함수로 상수값을 가져올수 있다.

정의된 모든 상수 목록을 구하려면 get_defined_constants() 함수를 쓴다.

상수와 (전역)변수는 서로 다른 네임스페이스(namespace)상에 있다. 이말의 의미는 예를 들면 TRUE와 $TRUE은 일반적으로 다르다는것이다.

해제된 상수를 사용한다면, PHP는 상수명 자체를 쓴것이라고 가정할것이다 즉,string으로 인식할것이다. (CONSTANT vs "CONSTANT") E_NOTICE로 이런 일이 발생했는지 알수 있다. 왜 $foo[bar]가 잘못됐는지 (bar를 상수로 define() 하지않았다면) 매뉴얼을 참고한다. 단순히 상수가 설정되었는지만 확인하려 한다면 defined()함수를 쓰면 됩니다.

다음은 상수와 변수의 차이점이다:

상수는 이름 앞에 달러표시($)가 없다.

PHP 5.3 이전에는,단순한 할당 연산이 아니라 define() 함수로만 정의될수 있다.

상수는 변수의 유효범위 규칙과는 상관없이 어느곳에서든 정의되거나 값을 취할수 있다.

상수는 한번 설정되면 재정의하거나 해제할수 없을것이다; 그리고

PHP 5.6 이후에서는, 상수는 스칼라 값 혹은 array의 값으로만 평가됩니다. 상수 스칼라 표현식에 array를 쓸 수 있습니다. (예를들어, const FOO = array(1,2,3)[0];) 하지만 최종 결과는 스칼라 값이어야 합니다.

Example #1 상수 정의하기

<?php

define("CONSTANT", "Hello world.");

echo CONSTANT; // "Hello world."을 출력한다

echo Constant; // "Constant"를 출력하고 경고가 뜬다.

?>

Example #2 const 키워드를 사용해서 상수 정의하기

<?php

// PHP 5.3.0부터 작동

const CONSTANT = 'Hello World';

echo CONSTANT;

// PHP 5.6.0 부터 작동

const ANOTHER_CONST = CONSTANT.'; Goodbye World';

echo ANOTHER_CONST;

?>

define()을 통하여 정의하는 상수와 달리, const 키워드를 통하여 정의하는 상수는 컴파일 시에 정의되기에 최상위 영역에서 선언해야 합니다. 함수, 루프, if구문이나 try/ catch블록 안에서는 선언할 수 없습니다.

미리 정의된 상수

PHP는 어떤스크립트에서도 유효한 많은 수의 미리 정의된 상수를 제공한다. 하지만 이 상수의 대부분은 다양한 확장(extension)에 의해 생성된다. 그래서 그 확장이 같이 컴파일되어 유효하거나 동적인 로딩이 되어있어야 이런 상수가 존재하게 된다.

여덟 가지 마법 상수가 존재한다. 이 상수들은 어디에서 쓰느냐에 따라 용도가 변경된다. 예를 들면, __LINE__상수의 값은 스크립트의 해당 줄과 관련이 있다. 이 특별한 상수들은 대소문자 구별이 없고 다음과 같다:

 

이름
설명
__LINE__
파일의 현재 줄 번호
__FILE__
심볼릭 링크를 통해 해석된 경우를 포함한 파일의 전체 경로와 이름. include 내부에서 사용할 경우, include된 파일명이 반환됩니다.
__DIR__
파일의 디렉토리. 포함한 파일 안에서는, 포함된 파일의 디렉토리를 반환합니다. 이는 dirname(__FILE__)과 동일합니다. 디렉토리명은 루트 디렉토리가 아닌 이상, 마지막에 슬래시가 없습니다.
__FUNCTION__
The function name.
__CLASS__
클래스명. (PHP 4.3.0에서 추가) PHP 5부터 이 상수는 정의된 그대로의 클래스명을 반환합니다. (대소문자 구분) PHP 4에서는 항상 소문자였습니다. 클래스명은 선언한 이름공간을 포함합니다. (예. Foo\Bar) PHP 5.4부터 __CLASS__는 trait에서도 동작합니다. trait 메소드 안에서 사용할 때, __CLASS__는 trait가 사용되는 클래스명입니다.
__TRAIT__
trait 명. trait 명은 이를 선언한 네임스페이스를 포함합니다. (예. Foo\Bar)
__METHOD__
클래스 메소드명.
__NAMESPACE__
현재 네임스페이스 이름.

728x90