PHP中各种数据类型的区别和转换方法

PHP本身可以通过隐式类型转换和显式类型转换两种方式来实现:

1. 隐式类型转换

例如

<?php
$a = 7;
$b = 'abcdsfdf';
echo $a . $b;
?>

在这里 $a 就被隐式的转化成了字符串,源码实现如下

if (UNEXPECTED(Z_TYPE_P(op1) != IS_STRING)) {
if (Z_ISREF_P(op1)) {
   op1 = Z_REFVAL_P(op1);
if (Z_TYPE_P(op1) == IS_STRING) break;
}
ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_CONCAT, concat_function);
use_copy1 = zend_make_printable_zval(op1, &op1_copy);

2. 显式类型转换

例如

<?php
$double = 5.2323;
echo (int)$double;
?>

此时$double被强制转化为整形,该函数的实现是由源码中convert_to一系列方法实现的。

例如:ZEND_API void ZEND_FASTCALL _convert_to_string(zval *op ZEND_FILE_LINE_DC)

除此之外,还可以用

bool settype ( mixed &$var , string $type )函数来实现变量类型转化,源码实现如下:

PHP_FUNCTION(settype)
{
    zval *var;
    char *type;
    size_t type_len = 0;
    if (zend_parse_parameters(ZEND_NUM_ARGS(), "zs", &var, &type, &type_len) == FAILURE) {
        return;
    }
    ZVAL_DEREF(var);
    if (!strcasecmp(type, "integer")) {
        convert_to_long(var);
    } else if (!strcasecmp(type, "int")) {
        convert_to_long(var);
    } else if (!strcasecmp(type, "float")) {
        convert_to_double(var);
    } else if (!strcasecmp(type, "double")) { /* deprecated */
        convert_to_double(var);
    } else if (!strcasecmp(type, "string")) {
        convert_to_string(var);
    } else if (!strcasecmp(type, "array")) {
        convert_to_array(var);
    } else if (!strcasecmp(type, "object")) {
        convert_to_object(var);
    } else if (!strcasecmp(type, "bool")) {
        convert_to_boolean(var);
    } else if (!strcasecmp(type, "boolean")) {
        convert_to_boolean(var);
    } else if (!strcasecmp(type, "null")) {
        convert_to_null(var);
    } else if (!strcasecmp(type, "resource")) {
        php_error_docref(NULL, E_WARNING, "Cannot convert to resource type");
        RETURN_FALSE;
    } else {
        php_error_docref(NULL, E_WARNING, "Invalid type");
        RETURN_FALSE;
    }
    RETVAL_TRUE;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-22 01:38:42

PHP中各种数据类型的区别和转换方法的相关文章

c#与java中byte字节的区别及转换方法

原文:c#与java中byte字节的区别及转换方法 在java中  byte的范围在 [-128,127] 在C#中  byte的范围在 [0,255] 所以 java程序与C#程序 进行数据传输的时候 要先把java的byte数组转换成在[0,255]范围内的int型数组a[];再把a[]进行加密得到字符串str, 把字符串传到web服务上. 转换方法: int data[] = new int[bytes.length]; for(int i=0;i data[i] = bytes[i] &

JavaScript中基本数据类型和引用数据类型的区别

1.基本数据类型和引用数据类型 ECMAScript包括两个不同类型的值:基本数据类型和引用数据类型. 基本数据类型指的是简单的数据段,引用数据类型指的是有多个值构成的对象. 当我们把变量赋值给一个变量时,解析器首先要确认的就是这个值是基本类型值还是引用类型值. 2.常见的基本数据类型: Number.String .Boolean.Null和Undefined.基本数据类型是按值访问的,因为可以直接操作保存在变量中的实际值.示例: var a = 10; var b = a; b = 20;

java中基本数据类型跟引用数据类型的区别

基本数据类型 大小 范围 默认值 int(整形) 32 -2147483648~2147483648 0 long(长整形) 64 -9233372036854477808~9233372036854477808 0 float(浮点形) 32 -3.40292347E+38~3.40292347E+38 0.0f double(双精度) 64 -1.79769313486231570E+308~1.79769313486231570E+308 0.0d short(短整型) 16 -32768

讲说问题:|和||的区别以及&amp;和&amp;&amp;的区别。2、Java中的数据类型分几类?基本数据类型有哪些?

|和||的区别以及&和&&的区别. |或 为或运算 判断为逻辑或 || 为短路或 只有逻辑判断 当左侧为真不再继续判断 &与 为与运算 判断为逻辑与 &&为短路与 当左侧为假不再继续判断 java中的数据类型分几类? 分为基本数据类型和引用数据类型 基本数据类型有8种 引用数据类型 是指如数组 字符串 集合等 也可以是用户自定义的类型.如Person Phone等 原文地址:https://www.cnblogs.com/qingyundian/p/8416

Java中的基本数据类型和引用数据类型的区别

一.数据类型 Java中的数据类型分为两大类,基本数据类型和引用数据类型. 1.基本数据类型 基本数据类型只有8种,可按照如下分类 ①整数类型:long.int.short.byte ②浮点类型:float.double ③字符类型:char ④布尔类型:boolean No. 数据类型 大小/位 可表示数据范围 默认值 1 byte(字节型) 8 -128~127 0 2 short(短整型) 16 -32768~32767 0 3 int(整型) 32 -2147483648~2147483

MySQL中各种数据类型的长度及在开发中如何选择

接触MySQL这个数据库大概快要两年了,不过由于没有特别深入系统的去学习,大多也是停留在一知半解的状态.今天在工作中刚好碰到了表设计的问题,顺便写篇博客,把MySQL中数据类型和字段类型选择这方面给弄清楚. MySQL中的数据类型大体分为三大类,数值类型,时间日期类型以及字符串类型.下面将对这三种类型进行详细的介绍. 一.数值类型 MySQL 支持所有标准SQL 中的数值类型,其中包括严格数值类型(INTEGER.SMALLINT.DECIMAL 和NUMERIC),以及近似数值数据类型(FLO

如何判断js中的数据类型?

js六大数据类型:number.string.object.Boolean.null.undefined string: 由单引号或双引号来说明,如"string" number: 什么整数啊浮点数啊都叫数字,你懂的~ Boolean:  就是true和false啦 undefined: 未定义,就是你创建一个变量后却没给它赋值~ null:  故名思久,null就是没有,什么也不表示 object: 这个我也很难解释的说.就是除了上面五种之外的类型 如何判断js中的数据类型:type

java中的数据类型和运算符的总结归类。

首先学习java肯定先要了解java的发展史,以及java的特点,常见的dos命令,jdk的安装,如何开发java程序等等一下概念行的东西,这里面我都不一一说了. 今天这一章主要想总结一下java中的数据类型和运算符2大方面. 再说数据类型之前先说一下标识符的命名规则: 总的命名规则:见名知意.如果有多个单词组成,首单词小写,其余单词的首字母大写(驼峰命名法).1.首字母只能是字母,下划线和$2.其余字母可以字母,下划线,$和数字3.不能使用预留关键字4.严格区分大小写(总体来说和c语音一样)

【转】Java中equals和==的区别

[转]Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比较的是他们的值. 2.复合数据类型(类) 当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false. JAVA当中所有的类都是继承于Object这个基类的,