现在我们已经可以从符号表中获取用户在PHP语言里定义的变量了,是该做点其它事的时候了,举个比例,比如给它来个类型转换:-)。想想C语言中的类型转换细则,你的头是不是已经大了?但是变量的类型转换就是如此重要,如果没有,那我们的代码就会是下面这样了:
01 | void display_zval(zval *value) |
03 | switch (Z_TYPE_P(value)) { |
10 | if (Z_BVAL_P(value)) { |
16 | php_printf( "%ld" , Z_LVAL_P(value)); |
20 | php_printf( "%f" , Z_DVAL_P(value)); |
24 | PHPWRITE(Z_STRVAL_P(value), Z_STRLEN_P(value)); |
28 | php_printf( "Resource #%ld" , Z_RESVAL_P(value)); |
41 | php_printf( "Unknown" ); |
看完上面的代码,你是不是有点似曾相识的感觉?o(∩∩)o...哈哈,和直接<?php echo $foo;?>这个简单到极点的php语句来比,上面的实现算是天书了。当然,真正的环境并没有这么囧,内核中提供了好多函数专门来帮我们实现类型转换的功能,你需要的只是调用一个函数而已。这一类函数有一个统一的形式:convert_to_*()
02 | void change_zval_to_string(zval *value) |
04 | convert_to_string(value); |
08 | ZEND_API void convert_to_long(zval *op); |
09 | ZEND_API void convert_to_double(zval *op); |
10 | ZEND_API void convert_to_null(zval *op); |
11 | ZEND_API void convert_to_boolean(zval *op); |
12 | ZEND_API void convert_to_array(zval *op); |
13 | ZEND_API void convert_to_object(zval *op); |
15 | ZEND_API void _convert_to_string(zval *op ZEND_FILE_LINE_DC); |
16 | #define convert_to_string(op) if ((op)->type != IS_STRING) { _convert_to_string((op) ZEND_FILE_LINE_CC); } |
这里面有两个比较特殊,一个就是convert_to_string其实是一个宏函数,调用的另外一个函数;第二个便是没有convert_to_resource()的转换函数,因为资源的值在用户层面上,根本就没有意义,内核不会对它的值(不是指那个数字)进行转换。
好了,我们用php的echo的时候会先把变量转换成字符串,但是我们看见convert_to_string的参数是zval*的,你是不是开始担心在进行数据转换时破坏了原来数据的值?而我们<?php $a=intval($b);?>并不会破坏$b的值。把原来的值破坏掉的做法绝对不是一个好主意,内核中在echo一个变量的时候也不是这样做的。在下一章,我们将知道怎样便可以在不损坏原变量值的情况下,进行convert_to_类操作。
没有帐号? 现在注册.