php属于弱类型语言,使用数据时无需指定其数据类型。对于学C语言入门的我,刚刚接触时感觉很神奇,但是随之而来的也有烦恼。

总结一下php中默认的类型转换,按照运算符类型,只总结能够自动做类型转换的运算符,不能够转换的运算符在此不做罗列,关于运算符优先级,稍后会有单独的文章总结。

  • [],数组下标

只要数组有一个字符串类型的键,其余键都转换成字符串;没有键,或者键都为数字,所有键转换成整形,浮点数只舍不入,无下标的键为前一个下标加1

/*所有键类型转换成字符串*/
$arr = array('wolf', 'a'=>'hippo', '1'=>'tiger', 1=>'panda', '20'=>'elephant', '02'=>'cock', '2.0'=>'dog', 3.3=>'pangolin');
var_dump($arr[02]);//null, 找$arr[02]即$arr[2]转换成$arr['2'],数组没有下标为'2'的元素
var_dump($arr['1']);//panda, 'tiger'和'panda'的下标都为'1',后者把前者覆盖
var_dump($arr[0]);//wolf, 'wolf'元素自动添加下标0,转换成'0'
var_dump($arr[a]);//hippo, $arr[a]转换成$arr['a']
var_dump($arr[3.3]);//pangolin, $arr[3.3]转换成$arr[3]转换成$arr['3']
var_dump($arr['3.3']);//null, $arr['3.3'],数组没有下标为'3.3'的元素
/*所有键类型转换成整形*/
$arr = array('apple', 1=>'litchi', 2=>'pear', 4.4=>'banana', 'orange');
var_dump($arr[02]);//pear, $arr[02]即$arr[2]
var_dump($arr['02']);//null, 数组没有下标为'02'的元素
var_dump($arr['0']);//apple, apple自动添加下标0
var_dump($arr[4]);//banana, $arr[4.4]转换成$arr[4]
var_dump($arr[5]);//organe, oragne自动添加下标5(4+1)
  • ++/--,递增、递减

数字字符串转换成整形或者浮点型,转换后进行运算;非数字字符串最后一个字符对应的ASCII码做运算,类型不变。后一种情况时,只对递增运算符有效,递减运算符无效。

/*数字字符串转换成整形*/
$a = '108';
$a--;
var_dump($a);//int 107,字符串转换成整形进行运算
/*字符串最后一个字符对应的ASCII码做运算*/
$a = '1a4';
$a++;
var_dump($a);//string '1a5',最后一个字符对应的ASCII码做运算
$a = 'a';
$a++;
var_dump($a);//string b,非数字字符串不转换整形0,而是ASCII码做运算
$a--;
var_dump($a);//string b,递减运算符对字符字符串操作无效
  • 位运算符

~,按位取反运算时,类型不做转换;&,按位与,|,按位或,^,按位异或,<<,左移,>>右移操作时,字符串和浮点型转换成整形

/*按位取反运算时,类型不做转换*/
$a = '5';
var_dump(~$a);//乱码
/*&,按位与,|,按位或,^,按位异或,<<,左移,>>右移操作时,字符串和浮点型转换成整形*/
$a = 10.5;
var_dump($a >> 1);//5, 浮点型转换成整形
$a = '1abc';
var_dump($a << 1);//2, 字符串转换成整形
  • 逻辑运算符

其他类型转换成布尔型。空字符串''或'0'转换成false;数字0或0.0转换成false;空值NULL,没有成员的数组转换成false;其余都转换成布尔型true

$a = 'b';//true
$b = '0';//false
$c = 'false';//true
var_dump(!$a);//false
var_dump($a && $b);//false
var_dump($a && $c);//true
  • 算数运算符

字符串转换成整形或者浮点型

$a = '10.5';
$b = '12';
$c = 1;
var_dump($a+$b);//22.5, 字符串转换成浮点型
var_dump($a%$c);//0, 浮点型转换成整形
var_dump($a/$b);//0.875,整形转换成浮点型
  • 比较运算符

其他类型和数字类型做比较时,转换成数字类型。字符串之间的比较转换成ASCII码做比较。

$a = '12hkd';
$c = 12.0;
var_dump($a==$c);//true, 字符串转换成整形
$a = '12hkd';
$c = '12.0';
var_dump($a>$c);//true, 不转换,字符串ASCII码做比较
$a = 'd';
$c = 0;
var_dump($a==$c);//true, 字符串转换成整形
  • 赋值运算符

=,+=,-+,数字类型的赋值运算符,转换成数字类型。.=字符串类型的赋值,运算符转换成字符串

字符串转换成数字的原则为:从左边开始依次寻找,直到找到不为数字类型的字符为止,返回找到的数字转成数字类型。

  • 字符串连接符

转换成字符串

php运算时默认的类型转换的更多相关文章

  1. 我的Java开发学习之旅------>解惑Java进行三目运算时的自动类型转换

    今天看到两个面试题,居然都做错了.通过这两个面试题,也加深对三目运算是的自动类型转换的理解. 题目1.以下代码输出结果是(). public class Test { public static vo ...

  2. C# 中的隐式类型转换(运算时的隐式转换)和显示类型转换

    区别: 隐式转换失败编译会报错. 显示转换有可能精度丢失. 根据项目的编译设置,显示转换溢出可能会报错,如果设置溢出且未使用checked检查,运行时如果发生溢出会产出未知的计算结果. 在数字运算时, ...

  3. python自动类型转换(针对于Number数据类型来的)精度从低到高 bool->int-> float->complex 当两个不同是数据类型运算时候,默认想更高进度转化

    # ### 自动类型转换(针对于Number数据类型来的) ''' 精度从低到高 bool->int-> float->complex 当两个不同是数据类型运算时候,默认想更高进度转 ...

  4. js在运算时的类型转换

    日期类型与数字类型的运算 在加法时将日期对象与数字都当作字符串进行连接 字符串的运算方式中没有减法.乘法.除法.转化成数字类型进行运算 字符串类型字符与数字类型的运算 在加法时将二者都转换成字符串进行 ...

  5. Java中byte、short、char、int、long运算时自动类型转化问题

    -------------------------------------------------------------------------------------------------- ★ ...

  6. 使用C/C++,赋值运算时发生的转换

    使用C/C++,赋值运算时发生的转换主要有以下四种情况 一: 两边类型不同: 结果: 自动完成类型转换! 二: 长数赋给短数: 结果: 截取长数的低位送给短数! 三: 短数赋给长数: 结果: 原来是什 ...

  7. Double 类型运算时的精度问题

    double 类型运算时的 计算的精度不高,常常会出现0.999999999999999这种情况,那么就须要用BigDecimal   它是java提供的用来高精度计算的工具类 以下是对这个类的一个包 ...

  8. sql server 中进行除法运算时,如何得到结果是小数形式呢?

    我们正常进行除法运算时,sql默认是返回一个四舍五入的数 比如12除以5,17除以3 --算法1:返回结果:2 需要的是2.40 ) as 结果1 --算法2:返回结果:5 需要的是5.67 ) as ...

  9. 关于Java中用Double型运算时精度丢失的问题

    注:转自 https://blog.csdn.net/bleach_kids/article/details/49129943 在使用Java,double 进行运算时,经常出现精度丢失的问题,总是在 ...

随机推荐

  1. java从入门到卖肠粉系列

    java从入门到卖肠粉系列 注:本教程只是从JAVA基础开始,绝对不会跟公司有任何利益冲突,更不会出现一行公司项目的代码 QQ群:9547527 推荐用土豆,百度去上传太慢,百度云在线播放还要转码.. ...

  2. .net程序员必知必会

    1.C#,.Net和ASP.Net的区别: C#(Csharp):  .net平台下的一种语言:注:(其他语言也可以开发.Net程序)                   .net      :    ...

  3. Laravel的ORM入门

    源码目录在\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Relations下 关系:一对多(One To Many) 场景:每篇 ...

  4. Django之Model世界

    Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数 ...

  5. 怎么理解js的面向对象编程

    面向对象的语言有一个标志,即拥有类的概念,抽象实例对象的公共属性与方法,基于类可以创建任意多个实例对象,一般具有封装.继承.多态的特性!但JS中对象与纯面向对象语言中的对象是不同的,ECMA标准定义J ...

  6. KoaHub.js:使用ES6/7特性开发Node.js框架(2)

    介绍   KoaHub.js -- 基于 Koa.js 平台的 Node.js web 快速开发框架.可以直接在项目里使用 ES6/7(Generator Function, Class, Async ...

  7. python实现视频下载

    最近一两年短视频业务风生水起,各个视频网站都有各自特色的短视频内容.如果有这样一个程序,可以把各大视频网站的热门用户最新发布的视频都下载下来,不仅方便自己观看,还可以将没有版权的视频发布在个人社交网站 ...

  8. 进入IT行业四月后的感想(生活日志)欢迎评论

    又失眠了,其实挺困,翻来覆去却是睡不着,寻思右想,还是写篇东西吧,不能把失眠的时间给浪费了

  9. win7下Apache2.4安装、配置及服务自启动

    为了测试微信平台接口,在电脑上安装的Apache服务器,把安装步骤记下来以后备用 第一篇文章,不好请见谅 Apache2.4.17下载地址:http://www.apachelounge.com/do ...

  10. HTML页面内容禁止选择、复制、右键

    <body leftmargin=0 topmargin=0 oncontextmenu='return false' ondragstart='return false' onselectst ...