二:PHP 语法基础——变量、数据类型、输出

一、回顾与本篇目标

上一篇你安装了 PHP,用内置服务器跑通了第一个程序,还体验了 PHP 和 HTML 混合编写的便利性。你知道了 PHP 代码写在 <?php ?> 标记里,变量以 $ 开头,字符串用点号拼接。

这一篇我们要系统学习 PHP 的基础语法——变量、数据类型、运算符、输出语句。如果你之前学过 C 语言或 JavaScript,你会发现 PHP 的很多语法和它们几乎一样,学起来会非常快。但 PHP 也有自己独特的地方,比如可变变量、超全局变量、数组的强大功能。

本篇的目标:

  1. 掌握 PHP 变量的命名规则和赋值方式
  2. 理解 PHP 的八种基本数据类型
  3. 学会 echoprint 的区别和使用场景
  4. 掌握字符串的拼接、插值和常用函数
  5. 理解类型转换和类型判断
  6. 认识 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)

布尔值只有两个:truefalse不区分大小写——TRUETruetrue 都可以,但推荐用小写。

$is_logged_in = true;
$has_permission = false;

// 输出时 true 显示为 1,false 显示为空字符串
echo $is_logged_in;   // 1
echo $has_permission;  // (什么都不输出)

PHP 中哪些值被视为 false(Falsy 值):

  • false 本身
  • 00.0
  • 空字符串 ''"0"
  • 空数组 []
  • NULL

其他所有值都是 true。 注意:"0"(字符串零)在 PHP 中是 falsy,这和 JavaScript 一样,但和 Python 不同。

3.5 NULL

NULL 表示“没有值”。不区分大小写——nullNullNULL 都可以,推荐用小写。以下情况变量会被视为 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 有两个基本的输出语句:echoprint

特性 echo print
性质 语言结构(不是函数) 语言结构(不是函数)
返回值 无返回值 始终返回 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 零基础入门,每周更新。

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容