首页 > PHP

深入理解PHP内核 第三章 第七节 数据类型转换

时间:2011-05-18 23:56:12  作者:chinaitlab  我要投稿
Linux初探欢迎您的投稿,投放方法请点击这里查看,我们会定期赠送精美小礼品给优秀的投稿作者。海纳百川 取则行远!LinuxGoo欢迎您的到来。
第七节 数据类型转换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;

如果您需转载 深入理解PHP内核 第三章 第七节 数据类型转换,请注明来自LinuxGoo.com,其版权归原作者所有。请广大网友留言时遵纪守法,使用文明用语。如果您在应用中有什么问题,请在下面留言,我们会尽快解答。
来顶一下
近回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
相关文章
栏目热门