PHP基础教程(18)PHP语言基础之PHP的数据类型:PHP数据类型奇葩家族大赏:你家代码的血统够纯正吗?

一、开场白:你家变量是不是“变色龙”?

哥们儿,你有没有这种经历——昨天还能正常跑的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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值