之前一直对 PHP 中关于字符串的算数运算隐式类型转换规则和递增/递减操作符针对字符串的操作比较模糊,今天总结一下。

一、隐式转换

二进制算术运算符的隐式类型转换规则(http://php.net/manual/zh/language.types.string.php

第一个操作数类型 第二个操作数类型 类型转换
整型 浮点型 整型转换为浮点型
整型 字符串 字符串转换为数字,如果字符串转换后是浮点型,整型也会转换为浮点型
浮点型 字符串 字符串转换为浮点型

总结一下就是浮点型 > 整型 > 字符串。例如:

整型 + 浮点型 = 浮点型

$a = 12;
$b = 1.5;
$c = $a + $b; var_dump($c); // float 13.5

 

整型 + (非 数字和. 开头的)字符串 = 整型

$a = 12;
$b = 'hello1.5';
$c = $a + $b; var_dump($c); // int 12

这里 $b 从字符串转换成整型后变成了 0

整型 + 浮点型数字开头的字符串 = 浮点型

$a = 12;
$b = '1.5hello';
$c = $a + $b; var_dump($c); // float 13.5

$b 自动转换成了 float 1.5

整型 + 整型数字开头的字符串 = 整型

$a = 12;
$b = '1hello';
$c = $a + $b; var_dump($c); // int 13

  

整型 + 浮点型数字的字符串 = 浮点型

$a = 12;
$b = '1.5';
$c = $a + $b; var_dump($c); // float 13.5

  

整型 + (以.开头的)字符串 = 浮点型 或 整型

$a = 12;
$b = '.5hello';
$c = $a + $b; var_dump($c); // float 12.5

$b 转换成了 0.5

$a = 12;
$b = '.hello';
$c = $a + $b;
var_dump($c); // int 12

$b 不会转换为 float 0.0 而是转换成 int 0

  

整型 + 包含大写 E 或小写 e 的字符串(需要满足科学记数法的格式,必须要有尾数) = 浮点型

$a = 1;
$b = '1e3';
$c = $a + $b; var_dump($c); // float 1001

  

$a = 1;
$b = '1e-3';
$c = $a + $b; var_dump($c); // float 1.001

  

整型 + 十六进制数字的字符串 = 整型

$a = 1;
$b = '0x10';
$c = $a + $b; var_dump($c); // int 17

  

二、自动递增/递减操作符

字母的自动递增

自动递增 结果
"a" "b"
"z" "aa"
"spaz" "spba"
"b9" "c0"
"12" "13"

例1:一个字母进行递增,结果是它在字母表中的下一个字母

$a = 'a';
var_dump(++$a); // string 'b' (length=1)

例2:

$a = 'a';
var_dump(--$a); // string 'a' (length=1)

例3:"z" 或 "Z" 进行递增,会变成 "a" 或 "A",且字符左边的字符再递增(如果结果的 "a" 或 "A" 位于字符串左边第一个字符,那么还需要在它的左边再插入一个 "a" 或 "A")

$a = 'z';
var_dump(++$a); // string 'aa' (length=2)

  

例4:

$a = 'z1';
var_dump(++$a); // string 'z2' (length=2)

 

例5:

$a = 'z9';
var_dump(++$a); // string 'aa0' (length=3)

  

例6:

$a = 'b9';
var_dump(++$a); // string 'c0' (length=2)

  

例7:

$a = 'spaz';
var_dump(++$a); // string 'spba' (length=4)

  

例8:

$a = 'bz';
var_dump(++$a); // string 'ca' (length=2)

  

例9:

$a = '1z';
var_dump(++$a); // string '2a' (length=2)

  

例10:

$a = '*a';
var_dump(++$a); // string '*b' (length=2)

  

例11:

$a = '*a*';
var_dump(++$a); // string '*a*' (length=3)

  

例12:

$a = 'a*';
var_dump(++$a); // string 'a*' (length=2)

  

  

  

  

  

  

 

PHP 字符串的隐式转换规则以及针对包含字母的字符串的递增/递减操作的更多相关文章

  1. MySQL SQL优化之字符串索引隐式转换

    之前有用户很不解:SQL语句非常简单,就是select * from test_1 where user_id=1 这种类型,而且user_id上已经建立索引了,怎么还是查询很慢? test_1的表结 ...

  2. mysql字符串的隐式转换导致查询异常

    如果mysql某个字段(name)类型为varchar, 加了索引,在执行where查询的时候,传入了int的值,这样就会全表扫描,把每一条的值都转换成int(会出现"中国"-&g ...

  3. JavaScript 隐式类型转换

    JavaScript 隐式类型转换 原文:https://blog.csdn.net/itcast_cn/article/details/82887895 · 1.1 隐式转换介绍 · 1.2 隐式转 ...

  4. [Effective JavaScript笔记]第3条:当心隐式的强制转换

    js对类型错误出奇的宽容 3+true;  //4 3*””;  //0 3+[]; //3 3+[3]; //33 以上表达式在许多语言早就变红了.而js不但不报错还给你个结果. 极少情况会产生即时 ...

  5. Scala模式匹配| 隐式转换

    1. 模式匹配 Scala中的模式匹配类似于Java中的switch语法,但是更加强大.模式匹配语法中,采用match关键字声明,每个分支采用case关键字进行声明,当需要匹配时,会从第一个case分 ...

  6. Scala 隐式(implicit)详解

    文章正文 通过隐式转换,程序员可以在编写Scala程序时故意漏掉一些信息,让编译器去尝试在编译期间自动推导出这些信息来,这种特性可以极大的减少代码量,忽略那些冗长,过于细节的代码. 1.Spark 中 ...

  7. 深入js系列-类型(隐式强制转换)

    隐式强制转换 在其可控的情况下,减少冗余,让代码更简洁,很多地方都进行了隐式转换,比如常见的三目表达式.if().for().while.逻辑运算符 || &&,适当通过语言机制,抽象 ...

  8. python+selenium显示等待、隐式等待和强制等待的区别

    在实际使用selenium或者appium时,等待下个等待定位的元素出现,特别是web端加载的过程,都需要用到等待,而等待方式的设置是保证脚本稳定有效运行的一个非常重要的手段,在selenium中(a ...

  9. 每天多一点(2016.12.04)》Javascript隐式转换

    乱想 javascript为什么需要隐式转换?如果没有会出现什么情况? 找了一圈没有看到关于这个的讨论,只好自己研究了,可能不一定正确,自行辨知. 郁闷就是郁闷在好好的,为什么要搞个隐式转换,一般来讲 ...

随机推荐

  1. 将csv文件读入数据库

      USE LHJTest create table #temp6//创建临时表 ( A nvarchar(max) NOT NULL, B nvarchar(max), C nvarchar(max ...

  2. asp.net中membership使用oracle数据库(一)

    第一步 数据库的准备 使用 oracle 11g的数据库 需要安装好,安装过程中先决条件检查失败的处理:确认server服务已运行 cmd->net share c$=c: 就可以通过 orac ...

  3. Pycharm 快捷键

    Ctrl + Alt + Space   快速导入任意类 Alt + enter键    快速导入模块.创建类 Ctrl + /  注释/取消行注释 Ctrl + Shift + /         ...

  4. VC++ 实现简单的桌面截图

    使用了EasyX图像库,使用方法请参考:VC++ 制作一个简易的控制台时钟应用 简单的桌面截图代码: ///////////////////////////////////////////////// ...

  5. 批处理命令——call 和 start

    一.call命令总结 [1]call命令简介 学过汇编或C的朋友,肯定都知道call指令表示什么意思.其实,在这里它的意思也是一样的.在批处理脚本中,call命令用来从一个批处理脚本中调用另一个批处理 ...

  6. 搭建Git服务器

    在远程仓库一节中,我们讲了远程仓库实际上和本地仓库没啥不同,纯粹为了7x24小时开机并交换大家的修改. GitHub就是一个免费托管开源代码的远程仓库.但是对于某些视源代码如生命的商业公司来说,既不想 ...

  7. waxpatch修改任意类的用法

    例如:修改一个UIView(PJView)的子类和一个NSObject(PJModel)类,则需要在patch.lua文件中声明这两个要修改的类 并且建立这些待修改的类的对应的.lua文件 对应的.l ...

  8. C#回顾 - 7.如何使用反射实现工厂模式?

    工厂模式是一种比较常用的设计模式,其基本思想在于使用不同的工厂类型来打造不同产品的部件.例如,我们在打造一间屋子时,可能需要窗户.屋顶.门.房梁.柱子等零部件.有的屋子需要很多根柱子,而有的屋子又不需 ...

  9. [JAVA]HTTP请求应答作输入输出

    请求(需要发送数据给别人): URL url = new URL("需要请求的URL连接"); HttpURLConnection httpConnection = (HttpUR ...

  10. 表单验证——jquery validate使用说明【另一个教程】

    [参考:http://www.tuicool.com/articles/y6fyme] jQuery Validate jQuery Validate 插件为表单提供了强大的验证功能,让客户端表单验证 ...