84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
写了一段时间php有一个问题特别想不明白为什么使用define()定义常量 而它的值确可以是一个变量, 感觉完全不和逻辑呀!!
define()
光阴似箭催人老,日月如移越少年。
LZ要表达的是这个意思,因为$name是个变量,但是也还可以赋值给一个常量NAME
<?php $name = "xuwenzhi"; define('NAME', $name); echo NAME;
我的理解是php在进行词法分析时,就已经将$name值替换成了"xuwenzhi"这个字符串,而PHP在定义define()这个函数时,传进去的第二个参数实际上就是这个字符串的首地址,仅此而已,参考下define()函数的定义
ZEND_FUNCTION(define) { char *name; int name_len; zval *val; //用于接收"xuwenzhi" if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz|b", &name, &name_len, &val, &non_cs) == FAILURE) { return; } ... }
用define()定义的常量不可更改
它的值只能是string, int, boolean这种简单类型,用什么来定义不重要,因为它取的是define执行时这个变量的值。以后你的变量再怎么变常量也不会受影响。不过,通常define之后那个变量也没什么价值了。
常量和变量其实都是一个容器,看你如何去理解这个容器,比如JAVA的话用final String xx = xxx;来表达一个常量,实际上他定义的正确解释应该是另一个不可重写的变量xx这样。那个就简单了,定义了就不能改变的就是常量。PHP中另一个例子就是const,const定义的值在程序流程里面不能被改变,那么就可以理解为常量了。
LZ要表达的是这个意思,因为$name是个变量,但是也还可以赋值给一个常量NAME
我的理解是php在进行词法分析时,就已经将$name值替换成了"xuwenzhi"这个字符串,而PHP在定义define()这个函数时,传进去的第二个参数实际上就是这个字符串的首地址,仅此而已,参考下define()函数的定义
用
define()
定义的常量不可更改它的值只能是string, int, boolean这种简单类型,用什么来定义不重要,因为它取的是define执行时这个变量的值。以后你的变量再怎么变常量也不会受影响。
不过,通常define之后那个变量也没什么价值了。
常量和变量其实都是一个容器,看你如何去理解这个容器,比如JAVA的话用final String xx = xxx;来表达一个常量,实际上他定义的正确解释应该是另一个不可重写的变量xx这样。那个就简单了,定义了就不能改变的就是常量。PHP中另一个例子就是const,const定义的值在程序流程里面不能被改变,那么就可以理解为常量了。