一、开场白:你家变量是不是“变色龙”?
哥们儿,你有没有这种经历——昨天还能正常跑的PHP代码,今天突然抽风了?比如你算个 0.1 + 0.2,满心期待得到0.3,结果PHP告诉你:“不,你得到的是0.30000000000000004!”(别怀疑,试一下 echo 0.1 + 0.2;)。这不是PHP疯了,是你还没摸透它家里那帮“数据类型奇葩”的脾气。
PHP就像个溺爱孩子的家长,对变量实行“放养政策”:一个变量今天可以是整数,明天就能变成字符串,后天可能又成了数组。这种灵活到令人发指的特性,既是PHP上手快的原因,也是深夜debug的万恶之源。今天咱就掀开PHP数据类型家族的底裤,看看这帮成员到底有多“戏精”。
二、家族核心成员:标量类型(四个戏精)
1. 整数型(int)——精打细算的会计大哥
整数大哥的性格就俩字:死板。他眼里容不下半点小数,存钱只存整钞。但你别以为他简单,他可是有“身份证明”的:
<?php
// 不同进制的身份证展示
$decimal = 42; // 普通人:十进制
$hex = 0x2A; // 潮人:十六进制(也是42)
$octal = 052; // 复古派:八进制(还是42)
$binary = 0b101010; // 极客:二进制(没错,又是42!)
echo "十进制大哥:$decimal<br>"; // 42
echo "十六进制潮男:$hex<br>"; // 42
echo "八进制老干部:$octal<br>"; // 42
echo "二进制极客:$binary<br>"; // 42
// 但是大哥也有极限!
$max = PHP_INT_MAX; // 当前系统最大整数
$min = PHP_INT_MIN; // 当前系统最小整数
$overflow = PHP_INT_MAX + 1; // 超额了怎么办?
echo "大哥的极限:$max<br>";
echo "大哥的底线:$min<br>";
echo "超额的结果(变浮点了):$overflow<br>";
// 判读是不是纯正整数血统
$num1 = 42;
$num2 = "42";
$num3 = 42.0;
var_dump(is_int($num1)); // true,纯正血统
var_dump(is_int($num2)); // false,披着羊皮的狼
var_dump(is_int($num3)); // false,看着像但不是
?>
冷知识:当整数大哥存不下你的数字时,他会偷偷找浮点型弟弟帮忙(自动转浮点)。这就是为什么PHP_INT_MAX + 1会变成浮点数。
2. 浮点型(float/double)——爱带小数点的败家子
浮点型弟弟是家里的“数学黑洞”,他有两个名字:float或double(在PHP里这俩是双胞胎,没区别)。他的经典名言是:“我尽量精确,但不敢保证。”
<?php
// 浮点型迷惑行为大赏
$price = 9.99;
$scientific = 1.2e3; // 1.2 × 10³ = 1200
$negative_exp = 7E-3; // 7 × 10⁻³ = 0.007
echo "商品价格:\$$price<br>"; // $9.99
echo "科学计数法:$scientific<br>"; // 1200
echo "负指数:$negative_exp<br>"; // 0.007
// 著名翻车现场
echo "0.1 + 0.2 = " . (0.1 + 0.2) . "<br>"; // 0.30000000000000004
echo "0.7 + 0.1 = " . (0.7 + 0.1) . "<br>"; // 0.7999999999999999
// 浮点数比较的坑(错误示范)
$a = 0.1 + 0.2;
$b = 0.3;
if ($a == $b) {
echo "相等!才怪!";
} else {
echo "不相等!意料之中!<br>"; // 会执行这个
}
// 正确比较方式(用个小误差范围)
$epsilon = 0.00001;
if (abs($a - $b) < $epsilon) {
echo "在误差范围内算相等!<br>"; // 这才是正确打开方式
}
// 特殊值展示
$infinity = log(0); // 无穷大(理论上是)
$nan = acos(8); // 非数值(无效计算)
var_dump($infinity); // float(-INF)
var_dump($nan); // float(NAN)
var_dump(is_nan($nan)); // true
?>
重要提醒:千万别用浮点数算钱!除非你想被财务打死。金额请用整数(以分为单位)或者BCMath扩展。
3. 字符串(string)——话痨交际花
字符串小姐姐是家里最外向的,能跟所有类型打成一片。她的座右铭是:“没有我不能聊的天!”
<?php
// 四种穿搭风格(定义方式)
$single = '我是单引号字符串,$变量别想插进来<br>';
$double = "我是双引号字符串,可以插值:$single<br>";
$heredoc = <<<EOD
我是heredoc,多行文本小能手
变量也能解析:$single
想写多少行就写多少行!
EOD;
$nowdoc = <<<'EOD'
我是nowdoc,高冷版heredoc
变量?不解析:$single
保持原样是我的原则
EOD;
echo $single;
echo $double;
echo $heredoc . "<br>";
echo $nowdoc . "<br>";
// 字符串操作七十二变
$str = "Hello World!";
echo "原始:$str<br>";
echo "长度:" . strlen($str) . "<br>"; // 12
echo "单词数:" . str_word_count($str) . "<br>"; // 2
echo "反转:" . strrev($str) . "<br>"; // !dlroW olleH
echo "查找'World'位置:" . strpos($str, "World") . "<br>"; // 6
echo "替换:" . str_replace("World", "PHP", $str) . "<br>"; // Hello PHP!
// 字符串当数组玩(但不推荐)
echo "第一个字符:$str[0]<br>"; // H
echo "第七个字符:$str[6]<br>"; // W
// 实用函数大杂烩
$email = "user@example.com";
$html = "<script>alert('xss')</script>";
$spaces = " 太多空格了 ";
echo "邮箱验证:" . (filter_var($email, FILTER_VALIDATE_EMAIL) ? "有效" : "无效") . "<br>";
ech

最低0.47元/天 解锁文章
4659

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



