第七节 数据类型转换php中的变量不需要显式的数据类型定义, 可以给变量赋值任意类型的数据, PHP之间的数据类型转换有两种: 显式和隐式转换.隐式类型转换(自动类......
第七节 数据类型转换 php中的变量不需要显式的数据类型定义, 可以给变量赋值任意类型的数据, PHP之间的数据类型转换有两种: 显式和隐式转换.
隐式类型转换(自动类型转换) PHP中隐式数据类型转换很常见, 例如:
<?php $a = 10; $b = 'a string '; echo $a . $b;上面例子中字符串连接操作就存在自动数据类型转化, $a变量是数值类型, $b变量是字符串类型, 这里$b变量就是隐式(自动)的转换为字符串类型了. 通常自动数据类型转换发生在特定的操作上下文中, 类似的还有求和操作" ". 具体的自动类型转换方式和特定的操作有关. 下面就以字符串连接操作为例:
脚本执行的时候字符串的链接操作是通过Zend/zend_Operators.c文件中的如下函数进行:
ZEND_API int concat_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ */ { zval op1_copy, op2_copy; int use_copy1 = 0, use_copy2 = 0; if (Z_TYPE_P(op1) != IS_STRING) { zend_make_PRintable_zval(op1, &op1_copy, &use_copy1); } if (Z_TYPE_P(op2) != IS_STRING) { zend_make_printable_zval(op2, &op2_copy, &use_copy2); } // 省略 }可用看出如果字符串链接的两个操作数如果不是字符串的话则调用zend_make_printable_zval函数将操作数转换为"printable_zval"也就是字符串.
ZEND_API void zend_make_printable_zval(zval *expr, zval *expr_copy, int *use_copy) { if (Z_TYPE_P(expr)==IS_STRING) { *use_copy = 0; return; } switch (Z_TYPE_P(expr)) { case IS_NULL: Z_STRLEN_P(expr_copy) = 0; Z_STRVAL_P(expr_copy) = STR_EMPTY_ALLOC(); break; case IS_BOOL: if (Z_LVAL_P(expr)) { Z_STRLEN_P(expr_copy) = 1; Z_STRVAL_P(expr_copy) = estrndup("1", 1); } else { Z_STRLEN_P(expr_copy) = 0; Z_STRVAL_P(expr_copy) = STR_EMPTY_ALLOC(); } break; case IS_RESOURCE: Z_STRVAL_P(expr_copy) = (char *) emalloc(sizeof("Resource id #") - 1 MAX_LENGTH_OF_LONG); Z_STRLEN_P(expr_copy) = sprintf(Z_STRVAL_P(expr_copy), "Resource id #%ld", Z_LVAL_P(expr)); break; case IS_ARRAY: Z_STRLEN_P(expr_copy) = sizeof("Array") - 1;
1/4 1 2 3 4 下一页 尾页 |