鱼C论坛

 找回密码
 立即注册
查看: 3964|回复: 4

[技术交流] 【php包教不包会系列8】PHP 类型之整型

[复制链接]
发表于 2017-3-5 21:11:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 mumudontcry 于 2017-3-5 21:19 编辑

写在前面

这个星期要搬家,所以你们都没有见到我,这一讲我们讲一下 PHP 的整型

整型

一个 integer 是集合 ℤ = {..., -2, -1, 0, 1, 2, ...} 中的一个数

整型值可以使用十进制,十六进制,八进制或二进制表示,前面可以加上可选的符号(- 或者 +)。其中:

二进制表示:数字前加“0b”,这种表示在 PHP 5.4 开始可以使用
八进制表示:数字前加“0”,是数字零
十六进制表示:数字前加“0x”


整型的范围大小和平台大小有关,通常最大值是大约二十亿(32 位有符号)

PHP 不支持无符号整数。

正常情况你不需要考虑整型是否会溢出,如果需要考虑无限大小的整型(或者其他数字),可以使用 PHP 的数学扩展“BC Math”,这个扩展是内置的,所以,除非你是从事科学研究啊的职业的,不然你一辈子都不会遇到 PHP 数字越界的问题(我的意思是,你基本不需要考虑数字范围,这的确很符合 PHP 对程序员友好的宗旨,因此我们开始别的话题吧)
<?php

$a = 1234; // 十进制数
$a = -123; // 负数
$a = 0123; // 八进制数 (等于十进制 83)
$a = 0x1A; // 十六进制数 (等于十进制 26)

让我们来讨论一些比较实际的话题

既然在用 PHP 的时候,你基本不需要考虑数字越界问题,那么,整型到底还有什么好讨论的?其实是有的,上一讲我们讲了部分关于强制转换的话题,这一讲,我们就拿整型来重点讲一下这个话题

如果你读过其他的教程,比如:菜鸟教程里的 PHP 教程,等你读完,甚至等你开始学习 PHP,对于 PHP 的强制转换,你可能会有一种崩溃的感觉,是的,我开始接触的时候有一种这样的感觉:PHP 简直反人类,直到我后来理解了设计者的用意,我才接受了这种设定,那到底是什么?

PHP 喜欢数字!

阿西巴,这是什么鬼?

是的,PHP 会竭尽一切可能,让它看到的东西(大多数情况是字符串)都变成数字,接下来一些例子,你应该是无法接受的
<?php

echo (int) '1a2';
echo (int) '1e2';
var_dump('1e2' == 100);

第一条和第二条语句,结果是一样的,都是1,理由是,PHP 在字符串强制转换成数字时,会把不是数字的部分丢掉,这有点类似于人类的直觉,因为你在第一眼看到 “1a2”这个东西,然后我告诉你这是一个数字的时候,你会很自然认为它是1,哦,你觉得它不是?那是因为你被后面的2干扰了,如果是“1ae”这个字符串,你肯定会在我的“它是一个数字”的说明下,自动认为这个字符串是一个数字1!

对吧?

在这个情况之下,我们看看第三个语句,根据刚才的说明,由于这里用的不是全等于, PHP 会做相应的类型转换,所以……“1e2”肯定是1啊!

错,这是你的理解!不信你运行一下,结果是一个 true!

正确的理解应该是,此时,由于非全等于号的存在,PHP 进行了类型转换,和第二条语句不一样的是,这个不是强制的,这就导致了,PHP 会尝试着把你给出来的非数字类型的东西,转换成数字!那么“1e2”是什么?在数学中,e常常被用来表示科学计数法(不信你拿出你的科学计算器试一试),因此,这里

1e2 等于 1 * 10 的2次方,也就是100


于是,表达式的语句就是 true

这是 PHP 的类型转换特点,一个看起来很诡异的特点:

1、如果数字后面跟的字符不是e,那么 PHP 把数字后面的字符都丢掉,如果第一个就不是数字,那么这个字符串就是0
2、如果数字后面跟的字符是e,那么此时就是一个科学计数法

而我不认为它是一个 bug,因为设计者最开始的目的就是让那些看起来像数字的东西让它们尽可能是数字,这样的诡异结果反而有点人性化的意思,这一点你可以从 false 的判定上看出来,其他语言里,
“0”

如果问它的布尔值是什么,大多数语言可能会告诉你,是 true,可是 PHP 说,这是一个 false,为什么,因为你就算是一个字符串,里面是一个数字0,那也是“什么也没有啊!”对,就是:
什么也没有


一些小小的建议

1、一定要明确变量的类型,这一点在任何语言里都是通用的,即使在 PHP 这种弱类型的语言里,你也需要注意这一点
2、尽可能使用 ===,或者强制转换,这样做的好处和第一点一样,你无法预知进入函数或者进入变量的值是什么,但是起码你可以保证它出去或者在你使用的时候它应该是什么,这也是网络安全的一个很重要的部分
3、尽管 PHP 有这样的数字特点,那……在实际的项目中,请不要使用这样的奇怪代码,因为不懂的人可能不知道你要干嘛,代码还是给人看的,不是给计算机

作业

先不运行代码,告诉木木,下面的结果是什么?
<?php

var_dump(01090);

#################### 华丽的 PHP 版分割线 ####################


如果喜欢木木的讲解,就点击下方的订阅(读作:打赏),给木木点个赞吧,欢迎大家提出建议或者指正

一块钱买不了皮肤,买不了香烟,却可以跟着木木一起打怪升级,并给木木巨大的支持,有了大家的力量,木木就可以制造元气弹,打败……嗯,买一个好一点的女朋友啦

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-3-6 09:47:56 | 显示全部楼层
抢占沙发~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-6 09:59:39 | 显示全部楼层
本来以为 按照八进制 结果是584 ,后来运行 结果居然是8,查看php手册上写着:如果向八进制数传递了一个非法数字(即 8 或 9),则后面其余数字会被忽略。 so,这里按照 010 运行,结果就是 8 咯~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-6 12:58:05 | 显示全部楼层
569529989 发表于 2017-3-6 09:59
本来以为 按照八进制 结果是584 ,后来运行 结果居然是8,查看php手册上写着:如果向八进制数传 ...

解释得不错,其实关于数字的转换,PHP 规律理解了就不会觉得诡异,PHP 会尽可能把看到的东西转成数字,那么,当你给它一个八进制格式,但是后面的值又错了的时候,错误的就会被丢掉(字符串转数字也是直接丢掉,所谓尽可能,就是考虑了科学计数法这个特例),只要明确这个转换就很简单了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-6 12:58:27 | 显示全部楼层

你是沙发
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 22:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表