Skip to content

变量定义

变量用来保存程序运行中的数据:名字、数量、开关状态、一整份列表,都可以先放进变量,再拿去计算或输出。

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'文本
int8-1整数
float3.14小数
booltrue / false开关
array[1, 2, 3]列表或键值对
objectnew stdClass()对象,后面进阶再讲
nullnull「没有值」

不确定手里是什么时,用 var_dump()gettype()

php
<?php

$age = 18;
var_dump($age);         // int(18)
echo gettype($age), "\n"; // integer

echo 只会把值印出来,看不清类型。布尔值和 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):有这个变量,并且值不是 null
  • empty($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 = "其他"; // 不行
变量常量
写法$nameAPP_NAME
能否修改不能
典型用途会变化的数据配置、不会变的名称

会变的用变量,不会变的用常量。

可变变量(了解即可)

PHP 允许用一个变量的值当作另一个变量的名字。这很容易把代码写乱,知道有这回事就行,正式项目里尽量不用:

php
<?php

$field = "title";
$title = "PHP 基础";

echo $$field, "\n"; // 输出 PHP 基础,等价于 echo $title

书写建议

  • 名字要能看懂:$userCount 优于 $n$tmp2
  • 一个变量只表达一件事,不要把 $data 今天当字符串、明天当数组
  • 使用前先赋值,不要读未定义变量
  • 输出到 HTML 前做转义;命令行调试用 var_dump()
  • 同一份代码里统一命名风格

练习

  1. 定义 $name$language$day,用 echo 输出一句:小明 正在学习 PHP,第 1 天(三个词都来自变量)。
  2. $score 赋值为 60,再用复合赋值加 15,输出结果。
  3. 写两段代码,分别演示按值赋值和引用赋值的差别。
  4. ""0null、未赋值变量分别 var_dump(isset(...))var_dump(empty(...)),对照结果。

上一篇:echo 与 print
下一篇:算术运算符

基于 VitePress 构建的 PHP 基础学习指南