主题
变量定义
变量用来保存程序运行中的数据:名字、数量、开关状态、一整份列表,都可以先放进变量,再拿去计算或输出。
PHP 变量以 $ 开头。保存为 var.php 后执行 php var.php:
php
<?php
$name = "PHP";
$year = 1995;
$active = true;
echo "{$name} 诞生于 {$year} 年\n";输出:
PHP 诞生于 1995 年如何定义
PHP 不需要先声明类型再使用。写出 $名字 = 值 就是在定义(同时赋值):
php
<?php
$site = "PHP Guide"; // 字符串
$count = 3; // 整数
$pi = 3.14; // 浮点数
$ok = true; // 布尔值
$tags = ["echo", "变量"]; // 数组
$empty = null; // 空同一个变量可以改成另一种类型的值(弱类型)。现代 PHP 仍然允许这样做,但可读的代码会尽量让一个变量始终表示同一种东西。
php
<?php
$version = 8; // int
$version = "8.3"; // 之后变成 string,能跑,但不推荐来回变命名规则
合法变量名:$ 后面必须是字母或下划线,之后可以跟字母、数字、下划线。变量名区分大小写。
php
<?php
$userName = "xiaoming"; // 可以
$_count = 1; // 可以,常用于内部/临时值
$user2 = "lisi"; // 可以
// $2user = "wang"; // 不行:不能以数字开头
// $user-name = "zhao"; // 不行:不能有连字符下面两个是不同的变量:
php
<?php
$title = "首页";
$Title = "后台";
echo $title, " / ", $Title, "\n";建议统一用小驼峰($userName)或下划线($user_name),在同一个项目里只选一种。
赋值与再赋值
等号 = 是赋值,不是数学里的「相等」:
php
<?php
$score = 60;
$score = $score + 10; // 70
$score += 10; // 80,复合赋值可以连续赋值,几个变量会拿到同一个值(按值复制):
php
<?php
$a = $b = $c = 1;交换两个变量,用临时变量即可:
php
<?php
$left = "A";
$right = "B";
$tmp = $left;
$left = $right;
$right = $tmp;PHP 7.1 起也可以写成 [$left, $right] = [$right, $left];。
按值还是按引用
默认是按值赋值:改 $b 不会影响 $a。
php
<?php
$a = "hello";
$b = $a;
$b = "world";
echo $a, "\n"; // hello
echo $b, "\n"; // world在等号前加 & 变成引用赋值,两个名字指向同一份数据:
php
<?php
$a = "hello";
$b = &$a;
$b = "world";
echo $a, "\n"; // world
echo $b, "\n"; // world初学阶段先掌握按值赋值。引用容易让数据在意想不到的地方被改掉,用之前要明确「我就是要共享同一份值」。
常见类型
| 类型 | 例子 | 说明 |
|---|---|---|
string | "PHP"、'Guide' | 文本 |
int | 8、-1 | 整数 |
float | 3.14 | 小数 |
bool | true / false | 开关 |
array | [1, 2, 3] | 列表或键值对 |
object | new stdClass() | 对象,后面进阶再讲 |
null | null | 「没有值」 |
不确定手里是什么时,用 var_dump() 或 gettype():
php
<?php
$age = 18;
var_dump($age); // int(18)
echo gettype($age), "\n"; // integerecho 只会把值印出来,看不清类型。布尔值和 null 尤其容易被 echo 「吃掉」,这在 echo 与 print 里也提过。
未定义的变量
PHP 8 起,读取从未赋值的变量会给出 Warning,并当成 null 继续跑:
php
<?php
echo $missing; // Warning: Undefined variable $missing正式代码里不要依赖「未定义就算空」。需要用之前先赋值,或者先判断是否存在。
isset、empty、unset
这三个是处理变量时最常用的语言结构。
php
<?php
$name = "小明";
$blank = "";
$zero = 0;
$none = null;
var_dump(isset($name)); // true:已定义且不是 null
var_dump(isset($blank)); // true:空字符串也算存在
var_dump(isset($none)); // false:值是 null
var_dump(isset($missing)); // false:未定义,且不会报警
var_dump(empty($blank)); // true
var_dump(empty($zero)); // true:0、"0"、[]、null、false、"" 都算 empty
var_dump(empty($missing)); // true:未定义也是 empty,不会报警
unset($name); // 删除变量
var_dump(isset($name)); // false记忆要点:
isset($x):有这个变量,并且值不是nullempty($x):觉得它「空」(包括0、""、[]等),未定义时也是true,且不会因此报警unset($x):把变量删掉
判断「用户有没有传名字」时,isset() / empty() 比直接 echo 可靠。和 is_null() 的对照、对照表见 内置函数。
输出变量
定义之后,通常会交给 echo 使用:
php
<?php
$lang = "PHP";
$topic = "变量定义";
echo $lang . " / " . $topic . "\n";
echo "{$lang} / {$topic}\n";单引号不会解析变量:
php
<?php
$lang = "PHP";
echo '$lang'; // 输出 $lang 这五个字符更完整的输出方式见 echo 与 print。
作用域先记这一点
现在写的都是当前脚本里的局部变量。函数内部默认看不到外面的变量:
php
<?php
$site = "PHP Guide";
function showSite(): void
{
// echo $site; // 函数内不能直接用外面的 $site
$site = "函数里的同名变量,是另一个";
echo $site, "\n";
}
showSite();
echo $site, "\n"; // 仍然是 PHP Guide需要跨函数共享数据时,优先用参数和返回值,而不是 global。超全局变量($_GET、$_POST、$_SERVER 等)是 PHP 预先准备好的,任何地方都能读。完整规则见 变量的作用域 与 超全局变量。
变量和常量
常量也是「存一份数据」,但定义后不能改,名字前面没有 $:
php
<?php
const APP_NAME = "PHP Guide";
define("APP_VERSION", "1.0");
echo APP_NAME, " ", APP_VERSION, "\n";
// APP_NAME = "其他"; // 不行| 变量 | 常量 | |
|---|---|---|
| 写法 | $name | APP_NAME |
| 能否修改 | 能 | 不能 |
| 典型用途 | 会变化的数据 | 配置、不会变的名称 |
会变的用变量,不会变的用常量。
可变变量(了解即可)
PHP 允许用一个变量的值当作另一个变量的名字。这很容易把代码写乱,知道有这回事就行,正式项目里尽量不用:
php
<?php
$field = "title";
$title = "PHP 基础";
echo $$field, "\n"; // 输出 PHP 基础,等价于 echo $title书写建议
- 名字要能看懂:
$userCount优于$n、$tmp2 - 一个变量只表达一件事,不要把
$data今天当字符串、明天当数组 - 使用前先赋值,不要读未定义变量
- 输出到 HTML 前做转义;命令行调试用
var_dump() - 同一份代码里统一命名风格
练习
- 定义
$name、$language、$day,用echo输出一句:小明 正在学习 PHP,第 1 天(三个词都来自变量)。 - 把
$score赋值为60,再用复合赋值加15,输出结果。 - 写两段代码,分别演示按值赋值和引用赋值的差别。
- 对
""、0、null、未赋值变量分别var_dump(isset(...))和var_dump(empty(...)),对照结果。
上一篇:echo 与 print
下一篇:算术运算符