PHP에서 define() 으로 정의하는 상수에 대한 이야기.

Module Initiation에서 등록해주면 된다.
몇가지 매크로가 있어서 손쉽게 등록이 가능.



/*
문자열 상수 등록
arg1 = 상수명
arg2 = 값
arg3 = flag
  CONST_CS: Case Sensitive (True, False, Null 같은 일부는 case insensitive)
  CONST_PERSISTENT: 모듈이 목숨을 다할 때까지 남아있길 바라는 마음
*/

REGISTER_STRING_CONSTANT("MYEXT_STR", "my ext string", CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("MYEXT_LONG", 558489, CONST_CS | CONST_PERSISTENT);
REGISTER_DOUBLE_CONSTANT("MYEXT_DOUBLE", 3.141592, CONST_CS | CONST_PERSISTENT);
REGISTER_STRINGL_CONSTANT("MYEXT_STRL", "stringl", strlen("stringl"), CONST_CS | CONST_PERSISTENT);




매크로가 맵핑하고 있는 함수들의 형태는 다음과 같다.
void zend_register_long_constant(char *name, uint name_len, long lval, int flag, int module_number TSRMLS_DC);
void zend_register_double_constant(char *name, uint name_len, double dval, int flags, int module_number TSRMLS_DC);
void zend_register_string_constant(char *name, uint name_len, char *strval, int flags, int module_number TSRMLS_DC);
void zend_register_stringl_constant(char *name, uint name_len, char *strval, uint strlen, int flags, int module_number TSRMLS_DC);

// 사용예
// module_number는 엔진이 각 모듈에 부여하는 인식번호 같은 것으로 신경쓰지 말고 그냥 넘기면 됨
zend_register_string(constant("CONST_NAME", sizeof("CONST_NAME"), "CONST_VALUE", CONST_CS | CONST_PERSISTENT, module_number TSRMLS_CC);





위에 열거한 타입 외의 상수는 직접 노가다로 등록해줘야 함.
아래는 Boolean 형 등록함수 예제.
zend_constant 구조체에 값을 채우고 zend_register_constant() 함수로 등록. (zend_constants.h)

void REGISTER_BOOLEAN_CONSTANT(char *name, uint len, zend_bool bval, int flags, int module_number TSRMLS_DC)
{
    zend_constant c;

    ZVAL_BOOL(&c.value, bval);
    c.flags = CONST_CS | CONST_PERSISTENT;
    c.name = zend_strndup(name, len-1);
    c.name_len = len;
    c.module_number = module_number;
    zend_register_constant(&c TSRMLS_CC);
}




다음은 등록된 상수를 가져오는 법

zval val;

if (zend_get_constant("CONST_NAME", strlen("CONST_NAME"), &val TSRMLS_CC)) {
    convert_to_string(&val);
    php_printf("const = %s", Z_STRVAL(val));
}



상수를 가져오는 함수와 타입별 매크로

// zval 형태로 상수값 반환
zval *CONSTANT(char *name TSRMLS_DC)
{
    zval *c;
    MAKE_STD_ZVAL(c);
    zend_get_constant(name, strlen(name), c TSRMLS_CC);
}

// 타입별 매크로
#define CONST_STRING(name) Z_STRVAL_P(CONSTANT(name TSRMLS_CC))
#define CONST_LONG(name) Z_LVAL_P(CONSTANT(name TSRMLS_CC))
#define CONST_DOUBLE(name) Z_DVAL_P(CONSTANT(name TSRMLS_CC))
#define CONST_BOOL(name) Z_BVAL_P(CONSTANT(name TSRMLS_CC))




Posted by bloodguy
,