PHP: 变量与数据类型
变量就像带标签的盒子——你把数据放进盒子,贴上标签,以后用标签就能找到它。PHP 的变量标签必须以
$开头,这是 PHP 最明显的特征。
1. 变量的声明与命名
PHP 中声明变量很简单:$ + 变量名 = 值。不需要像 C/Java 那样先声明类型。
PHP
<?php
$name = "小明"; // 字符串
$age = 25; // 整数
$height = 1.75; // 浮点数
$isStudent = true; // 布尔值
?>
(1) 命名规则
| 规则 | 正确 | 错误 |
|---|---|---|
以 $ 开头 |
$name |
name(没有$) |
| 字母或下划线开头 | $name, $_name |
$1name, $-name |
| 后面可跟字母/数字/下划线 | $user_id, $user2 |
$user-id, $user@id |
| 区分大小写 | $name ≠ $Name |
|
| 使用 camelCase | $firstName, $userAge |
💡 提示: PHP 变量名以
$ 开头来自于 Perl 语言。这让你在 HTML 混写时一眼就能认出哪些是 PHP 变量。
2. PHP 的八种数据类型
PHP 有 8 种原始类型,分为三大类:
| 大类 | 类型 | 示例 | 说明 |
|---|---|---|---|
| 标量 | string |
"Hello" |
字符串 |
int |
42 |
整数 | |
float |
3.14 |
浮点数(也叫 double) | |
bool |
true / false |
布尔值 | |
| 复合 | array |
[1, 2, 3] |
数组 |
object |
new User() |
对象 | |
callable |
回调函数 | 可调用类型 | |
iterable |
可遍历 | 可迭代类型 | |
| 特殊 | null |
null |
空值 |
resource |
文件句柄/数据库连接 | 外部资源引用 |
▶ 示例:用 var_dump 查看变量类型
PHP
<?php
$name = "小明";
$age = 25;
$price = 19.99;
$isValid = true;
$nothing = null;
var_dump($name); // string(6) "小明"
var_dump($age); // int(25)
var_dump($price); // float(19.99)
var_dump($isValid); // bool(true)
var_dump($nothing); // NULL
?>
3. 字符串基本用法
PHP
<?php
$s1 = 'PHP教程'; // 单引号:纯字符串,不解析变量
$s2 = "PHP教程"; // 双引号:会解析里面的变量和转义符
$name = "小明";
echo '你好 $name'; // 你好 $name — 单引号不解析变量
echo "你好 $name"; // 你好 小明 — 双引号解析变量
?>
| 写法 | 解析变量? | 解析转义符? | 适用场景 |
|---|---|---|---|
'单引号' |
否 | 只转义 \\ 和 \' |
纯文本 |
"双引号" |
是 | 解析 \n \t 等 |
需要嵌入变量时 |
下一课会深入讲字符串的完整操作。
▶ 示例:单双引号对比
PHP
<?php
$name = "小明";
// 单引号:原样输出
echo '你好,$name!\n今天天气不错。';
// 输出:你好,$name!\n今天天气不错。
// 双引号:解析变量和转义符
echo "你好,$name!\n今天天气不错。";
// 输出:你好,小明!(换行)今天天气不错。
?>
4. 整数(int)与浮点数(float)
PHP
<?php
$decimal = 42; // 十进制
$hex = 0x2A; // 十六进制 (=42)
$octal = 052; // 八进制 (=42)
$binary = 0b101010; // 二进制 (=42)
$float1 = 3.14; // 浮点数
$float2 = 1.2e3; // 科学记数法 = 1200
$float3 = 7E-10; // 科学记数法 = 0.0000000007
?>
⚠️ 注意: 浮点数不能精确表示十进制小数。
0.1 + 0.2 在 PHP 中不等于 0.3,而是类似 0.30000000000000004。涉及金钱计算时,用整数存"分"或用 bcmath 扩展。
5. 布尔值(bool)
布尔值只有两个:true 和 false。不区分大小写,但习惯用小写。
PHP
<?php
$isLogin = true;
$isAdmin = false;
if ($isLogin) {
echo "欢迎回来!";
}
?>
💡 提示:
echo true 输出 1,echo false 输出空字符串(什么都不显示)。要查看布尔值用 var_dump()。
6. 类型检测函数
PHP
<?php
$name = "小明";
$age = 25;
var_dump(is_string($name)); // bool(true)
var_dump(is_int($age)); // bool(true)
var_dump(is_float($age)); // bool(false)
var_dump(is_bool($age)); // bool(false)
var_dump(is_array($name)); // bool(false)
// gettype() 返回类型名(调试用,不用于逻辑判断)
echo gettype($name); // string
?>
| 函数 | 检测类型 |
|---|---|
is_string() |
字符串 |
is_int() |
整数 |
is_float() |
浮点数 |
is_bool() |
布尔值 |
is_array() |
数组 |
is_null() |
NULL |
is_numeric() |
数字或数字字符串 |
7. 类型转换
PHP 是弱类型语言,会自动转换类型。你也可以显式转换:
PHP
<?php
// 自动转换
$result = "10" + 5; // 15("10"转成数字)
$text = "10" . 5; // "105"(数字5转成字符串)
// 显式转换
$intVal = (int) "123"; // 123
$floatVal = (float) "3.14"; // 3.14
$strVal = (string) 123; // "123"
$boolVal = (bool) 1; // true
?>
▶ 示例:类型转换综合
PHP
<?php
// 字符串转数字
$a = (int) "42";
echo $a + 8; // 50
// 数字转字符串
$b = (string) 100;
echo "价格:" . $b . "元"; // 价格:100元
// 布尔转换规则:以下值被视为 false
echo (int)((bool)0); // 0
echo (int)((bool)""); // 0
echo (int)((bool)[]); // 0
echo (int)((bool)null); // 0
// 其他所有值都是 true
?>
⚠️ 注意:
"0"、""、0、[]、null 在布尔上下文中都是 false。记不住时用 var_dump((bool)$x) 实际测一下。
8. isset() 和 empty()
这三个是 PHP 使用频率最高的变量处理函数:
PHP
<?php
$var1 = "Hello";
$var2 = null;
// isset():变量已设置且不为 null → true
var_dump(isset($var1)); // bool(true)
var_dump(isset($var2)); // bool(false)
var_dump(isset($notExist)); // bool(false) - 不存在
// empty():变量为空 → true(""、0、"0"、null、false、[] 都算空)
var_dump(empty($var1)); // bool(false) — "Hello" 不为空
var_dump(empty($var2)); // bool(true) — null 为空
var_dump(empty(0)); // bool(true) — 0 被视为空!
var_dump(empty($notExist)); // bool(true) — 不存在也视为空
?>
▶ 示例:isset vs empty 对比
PHP
<?php
function testVar(string $label, mixed $value): void {
echo "$label — isset: " . (isset($value) ? 'true' : 'false');
echo " | empty: " . (empty($value) ? 'true' : 'false') . "<br>";
}
testVar('"Hello"', "Hello");
testVar('""', "");
testVar('0', 0);
testVar('null', null);
// 观察每个值的 isset 和 empty 结果
?>
🔥 易错:
empty(0) 返回 true!0 被视为"空"。验证数字是否输入时,用 isset() 配合 is_numeric(),不要用 empty()。
❓ 常见问题
Q 为什么 echo false 不显示任何东西?
A 因为
echo false 等价于 echo ""(空字符串)。要查看布尔值用 var_dump($var) 或 echo $var ? 'true' : 'false'。Q
isset() 和 empty() 什么时候用哪个?A
isset() 判断"变量存在且有值(不为null)",用于检查表单是否提交。empty() 判断"变量是否为空/零/false",用于验证输入是否为空。检查数字输入用 isset() + is_numeric(),不要用 empty()。Q PHP 是弱类型语言,会不会容易出现类型 bug?
A 养成两个好习惯:(1) 用
=== 而非 == 做比较(严格比较不自动转换类型);(2) 在函数参数上加类型声明(PHP 7+ 支持)。后续课程会详细讲。📖 小节
- 变量以
$开头,命名用 camelCase,大小写敏感 - PHP 有 8 种类型:4 标量 + 4 复合/特殊
var_dump()查看变量的值和类型,是调试利器- 双引号解析变量,单引号不解析
(int)、(string)等强制转换类型isset()判断存在且不为 null,empty()判断为空(0 也视为空)
📝 作业
- 创建 3 个不同类型的变量(字符串、整数、布尔),用
var_dump()和gettype()分别查看类型。 - 写一段代码测试
isset()和empty()在以下值上的表现:"Hello"、""、0、null、未定义变量。总结它们的区别。 - 写一个类型转换练习:把用户输入的价格字符串(如
"99.9元")转成可计算的浮点数。试试(float)能直接转换吗?不能的话想想怎么办。