一、回顾与本篇目标
上一篇你安装了 PHP,用内置服务器跑通了第一个程序,还体验了 PHP 和 HTML 混合编写的便利性。你知道了 PHP 代码写在 <?php ?> 标记里,变量以 $ 开头,字符串用点号拼接。
这一篇我们要系统学习 PHP 的基础语法——变量、数据类型、运算符、输出语句。如果你之前学过 C 语言或 JavaScript,你会发现 PHP 的很多语法和它们几乎一样,学起来会非常快。但 PHP 也有自己独特的地方,比如可变变量、超全局变量、数组的强大功能。
本篇的目标:
- 掌握 PHP 变量的命名规则和赋值方式
- 理解 PHP 的八种基本数据类型
- 学会
echo和print的区别和使用场景 - 掌握字符串的拼接、插值和常用函数
- 理解类型转换和类型判断
- 认识 PHP 特有的可变变量
二、变量:$ 符号是 PHP 的标志
2.1 变量的声明和赋值
PHP 中所有变量都以 $ 符号开头,后面跟变量名。变量不需要声明类型,赋值时自动确定类型:
<?php
$name = "张三"; // 字符串
$age = 28; // 整数
$height = 175.5; // 浮点数
$is_student = true; // 布尔值
$hobbies = ["读书", "编程", "跑步"]; // 数组
echo $name; // 输出:张三
?>
和 C/JS/Python 的对比:
// C 语言:必须指定类型
int age = 28;
// JavaScript:用 let/const 声明
let age = 28;
# Python:不需要任何前缀
age = 28
// PHP:以 $ 开头
$age = 28;
$ 符号的由来:PHP 最初的设计者 Rasmus Lerdorf 选择 $ 符号,是因为 PHP 早期借鉴了 Perl 语言的语法(Perl 的变量也以 $ 开头)。$ 让变量在字符串和 HTML 中非常显眼,一眼就能看出“这里有一个变量”。
2.2 变量命名规则
- 以 $ 开头,后面跟字母或下划线。
- 不能以数字开头:
$1name不合法,$name1合法。 - 区分大小写:
$name和$Name是两个不同的变量。 - 不能使用 PHP 关键字:如
$if、$for、$class等。 - 命名习惯:PHP 社区常用驼峰命名法——
$userName、$studentScore。也有的用下划线命名法——$user_name、$student_score。两种都可以,但一个项目中应保持一致。
2.3 变量赋值的方式
普通赋值:
$a = 10;
$b = $a; // $b 得到 $a 的值的副本
$a = 20;
echo $b; // 10 —— $b 不受 $a 变化的影响
引用赋值:
在要赋值的变量前加 & 符号,让两个变量指向同一块内存:
$a = 10;
$b = &$a; // $b 和 $a 指向同一个值
$a = 20;
echo $b; // 20 —— $b 也跟着变了
这和 C 语言的指针有相似之处,但 PHP 中不能直接操作内存地址,& 只是让两个变量共享同一个值。
三、PHP 的数据类型
PHP 支持八种基本数据类型:
| 类型 | 说明 | 示例 |
|---|---|---|
| string | 字符串 | $name = "张三"; |
| int | 整数 | $age = 28; |
| float | 浮点数(也叫 double) | $price = 19.99; |
| bool | 布尔值 | $flag = true; |
| array | 数组 | $arr = [1, 2, 3]; |
| object | 对象 | 通过类实例化创建 |
| NULL | 空值 | $x = null; |
| resource | 资源类型(文件句柄、数据库连接等) | 通常由函数返回 |
3.1 字符串(string)
PHP 中定义字符串有四种方式:
<?php
// 方式一:单引号(不解析变量,不解析转义字符(除了 \\ 和 \'))
$str1 = 'Hello, $name'; // 输出:Hello, $name(变量不会被替换)
// 方式二:双引号(解析变量,解析转义字符如 \n \t)
$str2 = "Hello, $name"; // 输出:Hello, 张三(变量被替换)
// 方式三:Heredoc(多行字符串,类似双引号)
$str3 = <<<EOD
这是第一行
这是第二行,变量 {$name} 会被解析
EOD;
// 方式四:Nowdoc(多行字符串,类似单引号)
$str4 = <<<'EOD'
这是第一行
变量 {$name} 不会被解析
EOD;
?>
单引号 vs 双引号的选择:如果字符串中不需要嵌入变量,用单引号——性能略好,因为 PHP 不需要扫描变量。如果需要嵌入变量或转义字符,用双引号。
变量插值的两种写法:
$name = "张三";
// 简单写法:变量名后面跟空格或标点
echo "你好,$name!"; // 你好,张三!
// 花括号写法:变量名后面紧跟字母时使用
echo "你好,{$name}先生"; // 你好,张三先生
echo "你好,${name}先生"; // 同上,两种花括号写法等价
当变量名后面紧跟字母时,必须用花括号,否则 PHP 会把后面的字母也当作变量名的一部分。
3.2 整数(int)
PHP 的整数可以是十进制、八进制(以 0 开头)、十六进制(以 0x 开头)、二进制(以 0b 开头):
$decimal = 42; // 十进制
$octal = 052; // 八进制,等于十进制 42
$hex = 0x2A; // 十六进制,等于十进制 42
$binary = 0b101010; // 二进制,等于十进制 42
echo $decimal === $binary; // 输出 1(true)—— 它们值相同
整数溢出:PHP 的整数范围取决于操作系统(32 位系统约 ±21 亿)。如果运算结果超出范围,PHP 会自动转成浮点数。
3.3 浮点数(float)
浮点数用来表示带小数的数字:
$pi = 3.14159;
$scientific = 1.5e3; // 1500(科学计数法)
$tiny = 7E-10; // 0.0000000007
和所有语言一样,PHP 的浮点数也有精度问题:
echo 0.1 + 0.2; // 0.30000000000000004
echo (0.1 + 0.2) === 0.3; // false
处理精确小数(如金额)时,用字符串存储或用 BC Math 扩展。
3.4 布尔值(bool)
布尔值只有两个:true 和 false。不区分大小写——TRUE、True、true 都可以,但推荐用小写。
$is_logged_in = true;
$has_permission = false;
// 输出时 true 显示为 1,false 显示为空字符串
echo $is_logged_in; // 1
echo $has_permission; // (什么都不输出)
PHP 中哪些值被视为 false(Falsy 值):
false本身0和0.0- 空字符串
''和"0" - 空数组
[] NULL
其他所有值都是 true。 注意:"0"(字符串零)在 PHP 中是 falsy,这和 JavaScript 一样,但和 Python 不同。
3.5 NULL
NULL 表示“没有值”。不区分大小写——null、Null、NULL 都可以,推荐用小写。以下情况变量会被视为 NULL:
- 被赋值为
null。 - 尚未被赋值(未定义的变量)。
- 被
unset()销毁。
$x = null;
var_dump($x); // NULL
unset($x); // 销毁变量
var_dump($x); // NULL + 警告:未定义变量
3.6 用 var_dump() 查看变量的类型和值
var_dump() 是 PHP 中最常用的调试函数,它输出变量的类型和值:
$name = "张三";
$age = 28;
$score = 92.5;
$is_pass = true;
$hobbies = ["读书", "编程"];
var_dump($name); // string(6) "张三"
var_dump($age); // int(28)
var_dump($score); // float(92.5)
var_dump($is_pass); // bool(true)
var_dump($hobbies); // array(2) { [0]=> string(6) "读书" [1]=> string(6) "编程" }
var_dump() 相当于 JavaScript 的 console.log() 加上类型信息,是 PHP 开发中最常用的调试手段。
四、echo 和 print:输出内容
PHP 有两个基本的输出语句:echo 和 print。
| 特性 | echo | |
|---|---|---|
| 性质 | 语言结构(不是函数) | 语言结构(不是函数) |
| 返回值 | 无返回值 | 始终返回 1 |
| 参数数量 | 可以接收多个参数(逗号分隔) | 只能接收一个参数 |
| 速度 | 略快 | 略慢(差别可忽略) |
| 使用频率 | 极高 | 较低 |
<?php
// echo 可以输出多个字符串
echo "Hello", " ", "World"; // Hello World
// print 只能输出一个字符串,但有返回值
$result = print "Hello"; // 输出 Hello,$result = 1
echo $result; // 1
// 实际开发中,echo 占了绝大多数使用场景
?>
echo 的快捷语法(在 HTML 中嵌入时):
<p>欢迎,<?= $name ?>!</p>
<!-- <?= $var ?> 等价于 <?php echo $var; ?> -->
<?= ?> 是 <?php echo ?> 的简写,在 PHP 模板中非常常见。
五、类型判断和类型转换
5.1 判断变量类型
$var = 42;
// 用 gettype() 获取类型名称
echo gettype($var); // "integer"
// 用 is_* 系列函数判断类型
echo is_int($var); // 1(true)
echo is_string($var); // (false,不输出)
echo is_numeric($var); // 1 —— 判断是否是数字或数字字符串
echo is_null($var); // (false)
echo isset($var); // 1 —— 判断变量是否已定义且不为 NULL
echo empty($var); // (false)—— 判断变量是否为空(falsy 值)
empty() 和 isset() 的区别:
| 变量状态 | isset() |
empty() |
|---|---|---|
| 未定义 | false | true |
null |
false | true |
0 或 "" |
true | true |
"hello" |
true | false |
日常使用建议:检查表单提交用 isset() 或 !empty(),检查变量类型用 is_* 系列函数。
5.2 类型转换
PHP 的类型转换和 C 语言语法完全一致——在变量前用括号指定目标类型:
// 强制类型转换
$str_num = "42";
$int_num = (int)$str_num; // 42(整数)
$float_num = (float)$str_num; // 42.0(浮点数)
$bool_val = (bool)$str_num; // true
// 用 settype() 函数转换(会修改原变量)
$value = "42.5";
settype($value, "int");
echo $value; // 42
字符串转数字的规则:
echo (int)"42abc"; // 42 —— 从头解析,遇到非数字停止
echo (int)"abc42"; // 0 —— 开头不是数字,转为 0
echo (int)"42.9"; // 42 —— 转整数是截断,不是四舍五入
六、可变变量:变量名可以动态生成
这是 PHP 特有的一个特性。可变变量允许你动态地使用一个变量的值作为另一个变量的名字:
$fruit = "apple";
$fruit = "红富士"; // 等价于 $apple = "红富士"
echo $apple; // 红富士
echo ${$fruit}; // 红富士 —— 另一种写法
实际用途:在某些需要动态生成变量名的场景下使用,比如循环中创建一组相关变量。但在现代 PHP 开发中,更推荐用数组来代替可变变量——数组更清晰、更安全。
// 不推荐的写法(可变变量)
$name1 = "张三";
$name2 = "李四";
// 推荐的写法(用数组)
$names = ["张三", "李四"];
echo $names[0]; // 张三
七、综合演示:一个用户信息卡片
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>用户信息</title>
<style>
body { font-family: sans-serif; padding: 40px; background: #f0f4f8; }
.card { background: white; padding: 30px; border-radius: 12px; max-width: 400px; margin: 0 auto; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
.card h2 { margin-top: 0; color: #333; }
.card .label { color: #999; font-size: 14px; }
.card .value { color: #333; font-size: 16px; margin-bottom: 12px; }
.badge { display: inline-block; padding: 4px 12px; border-radius: 20px; font-size: 12px; background: #e8f5e9; color: #2e7d32; }
</style>
</head>
<body>
<?php
// 用户数据
$user = [
"name" => "张三",
"age" => 28,
"city" => "上海",
"job" => "全栈开发工程师",
"is_verified" => true,
"skills" => ["PHP", "JavaScript", "Python", "MySQL"],
"score" => 92.5
];
?>
<div class="card">
<h2><?= $user["name"] ?> <?php if ($user["is_verified"]): ?><span class="badge">已认证</span><?php endif; ?></h2>
<div class="label">年龄</div>
<div class="value"><?= $user["age"] ?> 岁</div>
<div class="label">所在城市</div>
<div class="value"><?= $user["city"] ?></div>
<div class="label">职业</div>
<div class="value"><?= $user["job"] ?></div>
<div class="label">技能</div>
<div class="value">
<?= implode("、", $user["skills"]) ?>
</div>
<div class="label">评分</div>
<div class="value"><?= $user["score"] ?> 分</div>
<div class="label">类型检测</div>
<div class="value">
年龄类型:<?= gettype($user["age"]) ?><br>
评分类型:<?= gettype($user["score"]) ?><br>
是否成年:<?= $user["age"] >= 18 ? "是" : "否" ?>
</div>
</div>
</body>
</html>
代码解析:
<?= $var ?>是<?php echo $var; ?>的简写,让 HTML 中的 PHP 输出更简洁。<?php if (条件): ?> HTML <?php endif; ?>是 PHP 提供的替代语法,专门用于在 HTML 中嵌入条件判断,比用花括号更清晰。implode("、", $array)用顿号连接数组元素。gettype()在页面中输出变量类型,用于调试。
八、本篇动手练习
练习 1:变量类型探索
新建 practice2-1.php,声明不同类型的变量(字符串、整数、浮点数、布尔值、NULL、数组),用 var_dump() 输出每个变量的类型和值。
练习 2:个人信息卡片
新建 practice2-2.php,参考第七节的综合演示,制作你自己的个人信息卡片。用 PHP 变量存储数据,用 HTML + CSS 渲染页面。
练习 3:类型转换实验
新建 practice2-3.php,测试以下类型转换并输出结果:
- 字符串
"123abc"转整数 - 字符串
"abc123"转整数 - 浮点数
3.9转整数 - 整数
0转布尔值 - 字符串
"0"转布尔值
练习 4:简单的计算器
新建 practice2-4.php,用 PHP 变量存储两个数字和一个运算符(+、-、*、/),用 if/elseif 条件判断执行对应的运算并输出结果。注意除数不能为 0。
九、本篇小结
这一篇你系统学习了 PHP 的基础语法:
- 变量:以
$开头,动态类型,支持引用赋值(&)。命名用驼峰法。 - 八种数据类型:string、int、float、bool、array、object、NULL、resource。用
var_dump()查看类型和值。 - 字符串:单引号不解析变量,双引号解析变量。变量插值用
{$var}。拼接用点号.。 - 输出语句:
echo(最常用)和print(有返回值)。<?= ?>是echo的快捷语法。 - 类型判断:
gettype()、is_int()、is_string()、isset()、empty()。 - 类型转换:用
(int)、(float)、(string)等强制转换,和 C 语言语法一致。 - 可变变量:
$$var用变量的值作为变量名,但不推荐——用数组代替更好。
下一篇,我们学习 PHP 中最强大的数据结构——数组。PHP 的数组同时兼任了列表和字典两种角色,还支持各种排序、过滤、合并操作。
下一篇预告
下一篇——《PHP 数组——最强大的数据结构》:索引数组和关联数组、多维数组、数组的增删改查、foreach 遍历、常用数组函数(排序、过滤、合并、去重)。PHP 数组的强大远超你想象。
PHP 零基础入门,每周更新。













暂无评论内容