1. 开场白:PHP数据类型的“基本款”其实暗藏玄机
朋友们,咱们今天不聊那些花里胡哨的框架,也不扯什么设计模式。就聊聊最基础的东西——PHP的标量数据类型。你可能要打哈欠了:“不就是int、float、bool、string嘛,我第一天学PHP就知道了!”
别急,我问你几个问题:
- 为什么
"0"在条件判断里是false,但"0.0"却有点暧昧? - 当你说
$a = 0123;时,PHP眼里这个数字是多少? 1.2e3和1200真的是双胞胎吗?- 字符串和整型偷偷谈恋爱(自动转换)时,到底谁迁就谁?
如果你对任何一个问题犹豫了,那这篇文章就是为你准备的。我见过太多开发者,写了三年PHP,还在数据类型的基础坑里摔跤。今天咱们就把这四种“基本款”扒个精光,看看它们到底有多少你不知道的秘密。
2. 整型(int):不只是123那么简单
2.1 整型的多重身份
先看个让你怀疑人生的例子:
$a = 123; // 十进制,没毛病
$b = 0123; // 八进制,实际是83
$c = 0x1A; // 十六进制,实际是26
$d = 0b1101; // 二进制,实际是13
$e = 1_234_567; // PHP 7.4+,增强可读性,实际还是1234567
echo "0123的真身是:{$b}"; // 输出83,惊不惊喜?
八进制这个老古董:现在除了文件权限(比如0755),谁还用八进制?但PHP还支持,而且容易踩坑。如果你从表单接收个以0开头的电话号码,比如0123456789,PHP会“贴心”地把它当八进制处理——然后你就等着用户投诉吧。
2.2 整型的“天花板”和“地板”
PHP的整型是有范围的,在64位系统上:
echo PHP_INT_MAX; // 通常 9223372036854775807
echo PHP_INT_MIN; // 通常 -9223372036854775808
// 越界会怎样?
$big = PHP_INT_MAX + 1;
var_dump($big); // 自动转成float了!类型:float(9.2233720368548E+18)
真实案例:我见过一个电商系统,用自增ID做主键。当订单数超过21亿(32位限制)时,一切正常。但当接近922万亿(64位限制)时——虽然这得几千年后——代码里没做处理,理论上会出问题。当然,这属于“杞人忧天式编程”,但知道边界很重要。
2.3 整型转换的“潜规则”
PHP的弱类型让它经常自作主张:
$num = "42个小目标"; // 字符串开头是数字
echo (int)$num; // 输出42,后面的中文被无情抛弃
$price = "19.99元";
echo (int)$price; // 输出19,小数部分直接被砍
// 最坑爹的来了
$weird = "abc123";
echo (int)$weird; // 输出0,因为开头不是数字
开发建议:永远不要相信用户输入的数据类型。即使表单限定type="number",前端验证也可能被绕过。所以:
// 错误示范
$age = $_POST['age']; // 可能是"42岁",也可能是"不老松"
$next_year_age = $age + 1; // 可能得到1,也可能得到43
// 正确姿势
$age = filter_var($_POST['age'], FILTER_VALIDATE_INT);
if ($age === false) {
die("年龄必须是整数!");
}
// 现在$age肯定是整型
3. 浮点型(float/double):精度游戏里的“骗子”
3.1 那个经典问题:0.1 + 0.2 ≠ 0.3
几乎所有编程语言都有这个梗,PHP也不例外:
$a = 0.1;
$b = 0.2;
$c = 0.3;
var_dump($a + $b == $c); // bool(false) 扎心了!
echo $a + $b; // 0.30000000000000004
为什么?因为计算机用二进制表示小数,就像我们用十进制无法精确表示1/3(0.33333...)一样。二进制无法精确表示0.1、0.2这样的十进制小数。
3.2 浮点数的正确比较方式
// 错误:直接比较
if (0.1 + 0.2 == 0.3) {
echo "相等"; // 永远不会执行
}
// 正确:允许微小误差
$epsilon = 0.00001;
if (abs((0.1 + 0.2) - 0.3) < $epsilon) {
echo "在误差范围内相等"; // 这个会执行
}
// 或者用BC Math函数(任意精度数学)
echo bcadd('0.1', '0.2', 10); // 0.3,参数10表示小数点后10位
3.3 科学计数法:大数字的优雅写法
$distanceToSun = 1.496e8; // 1.496 × 10^8 = 149,600,000 公里
$electronMass = 9.109e-31; // 9.109 × 10^-31 千克
echo $distanceToSun; // 输出149600000
echo gettype($distanceToSun); // double(就是float)
实用技巧:处理金钱时,永远不要用浮点数!用整数表示分,或者用bcmath、gmp扩展:
// 错误:浮点数计算金额
$total = 0.1 + 0.2; // 0.30000000000000004
$price = $total * 100; // 可能是30.000000000000004
// 正确:用分做单位
$totalCents = 10 + 20; // 30分
$price = $totalCents / 100; // 0.3元,完美
// 或者用字符串+BC Math
echo bcmul('0.1', '0.2', 2); // 0.02,参数2表示保留2位小数
4. 字符串(string):PHP里的“橡皮筋”
4.1 字符串的四种写法,你都会吗?
// 1. 单引号(最简单,最快)
$name = '张三';
echo '我叫$name'; // 输出"我叫$name",不解析变量!
// 2. 双引号(会解析变量和转义字符)
echo "我叫{$name}"; // 输出"我叫张三"
echo "换行符:\n,制表符:\t";
// 3. heredoc(相当于双引号,适合大段文本)
$html = <<<HTML
<div class="user">
<h1>{$name}</h1>
<p>欢迎来到PHP世界!</p>
</div>
HTML;
// 4. nowdoc(相当于单引号,PHP 5.3+)
$code = <<<'CODE'
<?php
echo '这里面的$name不会解析';
echo "\n也不会解析转义字符";
?>
CODE;
性能小贴士

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



