每个操作都有5种不同的类型:
#define IS_CONST (1<<0) //1
#define IS_TMP_VAR (1<<1) //2
#define IS_VAR (1<<2) //4
#define IS_UNUSED (1<<3) //8
#define IS_CV (1<<4) //16
"hello~" . time()
的值类型就是IS_TMP_VAR,再比如:$a = "123" + $b,"123" + $b
的结果类型也是IS_TMP_VAR,从这两个例子可以猜测,临时变量多是执行期间其它类型组合现生成的一个中间值,由于它是现生成的,所以把IS_TMP_VAR赋值给IS_CV变量时不会增加其引用计数$var_name
定义的。这个类型最常见的例子是PHP函数的返回值,再如$a[0]
数组这种,它取出的值也是IS_VAR
,再比如$$a
这种$var_name
定义的变量,这些变量是编译阶段确定的,所以是compile variable,result_type
除了上面几种类型外还有一种类型EXT_TYPE_UNUSED (1<<5)
,返回值没有使用时会用到,这个跟IS_UNUSED
的区别是:IS_UNUSED
表示本操作返回值没有意义(也可简单的认为没有返回值),而EXT_TYPE_UNUSED
的含义是有返回值,但是没有用到,比如函数返回值没有接收。