PHP常量
Posted JAVA菜鸟公社
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP常量相关的知识,希望对你有一定的参考价值。
php的常量
常量是一个不变的量值,它和数值只绑定一次,在脚本执行期间不能改变,和变量一样,是大小写敏感的,有助于增加程序的可读性。
常量的内部结构
typedef struct _zend_constant { zval value; #zval是php内部变量的存储结构,可以存储类型
int flags; #常量标识,CONST_PERSISTENT | CONST_CS | CONSR_CT_SUBSTR char *name; #常量名 uint name_len; int module_number; #模块号,区别于用户自定义还是内置的
} zend_constant;
define("CONSTANT", "Hello world.");
定义一个常量后,常量值会存放在zval结构之中。
define定义常量的过程
ZEND_FUNCTION(define){ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz|b", &name, &name_len, &val, &non_cs) == FAILURE) { return; } ... ... c.value = *val; zval_copy_ctor(&c.value); if (val_free) { zval_ptr_dtor(&val_free); } c.flags = case_sensitive; c.name = zend_strndup(name, name_len); c.name_len = name_len+1; c.module_number = PHP_USER_CONSTANT; if (zend_register_constant(&c TSRMLS_CC) == SUCCESS) { RETURN_TRUE; } else { RETURN_FALSE; }}
上述过程是一个将参数传递给zend_constant的过程,并将结构体注册到常量列表的过程,至于大小写敏感与否,默认是敏感的,而且最后赋值给flags字段
zend_bool non_cs = 0;
int case_sensitive = CONST_CS;
if(non_cs) { case_sensitive = 0;
} c.flags = case_sensitive;
关于常量的几种类型:
CONST_PERSISTENT: 表明常量是否是持久化的,用户定义的一般都不是持久化的,在程序结束后会被释放,在扩展和内核定义的一般是持久化的,如果不是持久的话,下次请求又会生成,这是没有意义的计算。
CONST_CT_SUBST:表明在程序执行过程中可以被替换,共有5个,TRUE,FALSE,NULL,ZEND_THREAD_SAFE和ZEND_DEBUG_BUILD。
当我们用define定义的的常量类型一般是PHP_USER_CONSTANT,php内置的E_ALL,E_WARNING一般属于标准常量。
zend引擎启动之后,会执行如下的注册过程, php_module_startup() -> zend_startup() -> zend_register_standard_constants()]
void zend_register_standard_constants(TSRMLS_D){ REGISTER_MAIN_LONG_CONSTANT("E_ALL", E_ALL, CONST_PERSISTENT | CONST_CS); ...}
ZEND_API void zend_register_long_constant(const char *name, uint name_len, long lval, int flags, int module_number TSRMLS_DC){ zend_constant c; c.value.type = IS_LONG; c.value.value.lval = lval; c.flags = flags; c.name = zend_strndup(name, name_len-1); c.name_len = name_len; c.module_number = module_number; zend_register_constant(&c TSRMLS_CC);}
这些常量都是持久化常量
其它:
PHP还有一些常量,会随着位置变化
__LINE__:当前行号
__FILE__:文件完整路径和文件名
__CLASS__:类名
__METHOD__:方法名
__DIR__:文件所在目录
__FUNCTION__:函数名
__NAMESPACE__:当前命名空间
本文参照:http://www.php-internals.com/book/
以上是关于PHP常量的主要内容,如果未能解决你的问题,请参考以下文章