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常量的主要内容,如果未能解决你的问题,请参考以下文章

PHP必用代码片段

php如何实现多继承?

PHP代码-psysh调试代码片段工具

超实用的php代码片段

比较有用的php代码片段

php Yoast SEO规范输出的代码片段