PHP 变量详解

变量是 PHP 编程的基础,用于存储和操作数据。理解变量的使用是学习 PHP 的关键第一步。

什么是变量?

变量是用于存储信息的"容器",可以保存各种类型的数据,如数字、文本、数组等。

基础示例

<?php
$x = 5;
$y = 6;
$z = $x + $y;
echo $z;  // 输出 11
?>

变量与代数的相似性

在代数中,我们使用字母表示值:

x = 5
y = 6
z = x + y

从表达式 z = x + y,我们可以计算出 z 的值为 11。

在 PHP 中,这些字母被称为变量

💡
核心概念: 变量是用于存储数据的容器,可以通过变量名来访问和修改其中的数据。

PHP 变量命名规则

PHP 变量遵循特定的命名规则:

  • 以 $ 符号开头 - 所有 PHP 变量都以美元符号开始
  • 首字符规则 - 变量名必须以字母或下划线(_)开始
  • 字符限制 - 只能包含字母、数字和下划线 (A-z, 0-9, _)
  • 禁止空格 - 变量名中不能包含空格
  • 区分大小写 - $name 和 $Name 是两个不同的变量

合法的变量名示例:

<?php
// 合法的变量名
$name = "John";
$_age = 25;
$user1 = "admin";
$firstName = "Alice";
$last_name = "Smith";
?>

非法的变量名示例:

<?php
// 非法的变量名(会导致错误)
// $1number = 10;    // 不能以数字开头
// $user-name = "Tom"; // 不能包含连字符
// $user name = "Tom"; // 不能包含空格
// $function = "test"; // 虽然是合法命名,但避免使用保留字
?>
⚠️
重要提示: PHP 语句和变量名都是区分大小写的。$variable、$Variable 和 $VARIABLE 是三个不同的变量。

创建(声明)PHP 变量

PHP 是动态类型语言,无需预先声明变量类型。变量在第一次赋值时自动创建:

变量声明示例

<?php
// 不同类型的变量声明
$text = "Hello World!";     // 字符串
$number = 42;               // 整数
$price = 19.99;             // 浮点数
$is_active = true;          // 布尔值
$colors = array("red", "green", "blue"); // 数组

echo $text;     // 输出: Hello World!
echo $number;   // 输出: 42
?>

注意: 当为变量赋文本值时,必须在文本两侧使用引号(单引号或双引号)。

PHP 是松散类型语言

PHP 是一种弱类型(松散类型)语言,具有以下特点:

类型自动转换

<?php
// PHP 自动处理类型转换
$var = "10";        // 字符串 "10"
$var = $var + 5;    // 自动转换为整数 15
$var = $var . " apples"; // 转换为字符串 "15 apples"

echo $var; // 输出: 15 apples
?>

与强类型语言对比

在强类型语言(如 Java、C++)中,必须预先声明变量类型:

强类型语言(Java)

// Java 需要明确声明类型
int number = 10;
String text = "Hello";
// number = "text"; // 编译错误:类型不匹配

松散类型(PHP)

// PHP 自动处理类型
$number = 10;
$text = "Hello";
$number = "text"; // 允许:自动类型转换

PHP 变量作用域

变量的作用域决定了在脚本的哪些部分可以访问该变量。PHP 有四种作用域:

  • 局部(local) - 在函数内部声明的变量
  • 全局(global) - 在函数外部声明的变量
  • 静态(static) - 函数执行完毕后仍保留值的局部变量
  • 参数(parameter) - 函数参数列表中声明的变量

局部和全局作用域

全局变量

在所有函数外部定义的变量拥有全局作用域,可以在脚本的任何地方访问(除了函数内部)。

局部变量

在函数内部定义的变量拥有局部作用域,只能在函数内部访问。

作用域示例

<?php
$global_var = "我是全局变量"; // 全局变量

function testFunction() {
    $local_var = "我是局部变量"; // 局部变量
    echo $local_var; // 可以访问局部变量

    // echo $global_var; // 错误:无法直接访问全局变量
}

testFunction(); // 输出: 我是局部变量
echo $global_var; // 输出: 我是全局变量
// echo $local_var; // 错误:无法在函数外访问局部变量
?>
💡
提示: 在不同的函数中可以使用相同的变量名,因为它们是局部变量,只在各自的函数内有效。

global 关键字

要在函数内部访问全局变量,需要使用 global 关键字:

使用 global 关键字

<?php
$x = 5;
$y = 10;

function myTest() {
    global $x, $y;
    $y = $x + $y;
}

myTest();
echo $y; // 输出 15
?>

使用 $GLOBALS 数组

PHP 将所有全局变量存储在 $GLOBALS 数组中,也可以通过该数组访问全局变量:

<?php
$x = 5;
$y = 10;

function myTest() {
    $GLOBALS['y'] = $GLOBALS['x'] + $GLOBALS['y'];
}

myTest();
echo $y; // 输出 15
?>

Static 作用域

通常,函数执行完毕后,其所有局部变量都会被删除。使用 static 关键字可以保留局部变量的值:

静态变量示例

<?php
function myTest() {
    static $x = 0;
    echo $x;
    $x++;
}

myTest(); // 输出: 0
myTest(); // 输出: 1
myTest(); // 输出: 2
?>

每次调用函数时,静态变量会保留前一次调用结束时的值。

注意: 静态变量仍然是局部变量,只能在声明它的函数内部访问。

参数作用域

参数是通过调用代码传递给函数的局部变量,在函数参数列表中声明:

参数变量示例

<?php
function greetUser($name) {
    echo "Hello, " . $name . "!";
}

function calculateSum($a, $b) {
    return $a + $b;
}

greetUser("John"); // 输出: Hello, John!
echo calculateSum(5, 3); // 输出: 8
?>

变量最佳实践

命名约定

  • 使用有意义的变量名($userName 而不是 $un)
  • 保持命名一致性(camelCase 或 snake_case)
  • 避免使用保留字作为变量名

作用域管理

  • 尽量减少全局变量的使用
  • 合理使用静态变量记录状态
  • 注意变量作用域避免命名冲突

代码示例

<?php
// 好的变量命名和实践
$userName = "john_doe";
$isLoggedIn = true;
$itemCount = 0;
$shoppingCart = array();

// 避免的命名方式
$n = "john"; // 无意义
$flag = true; // 不明确
$cnt = 0; // 缩写不清晰
?>

变量相关函数

PHP 提供了一些有用的变量处理函数:

<?php
$testVar = "Hello World";

// 检查变量是否设置
if (isset($testVar)) {
    echo "变量已设置";
}

// 获取变量类型
echo gettype($testVar); // 输出: string

// 检查变量是否为空
if (!empty($testVar)) {
    echo "变量不为空";
}

// 释放变量
unset($testVar);
?>

总结

  • 变量以 $ 符号开头,用于存储数据
  • PHP 是松散类型语言,自动处理类型转换
  • 理解四种作用域:局部、全局、静态、参数
  • 使用 global 关键字在函数内访问全局变量
  • 使用 static 关键字保留局部变量的值
  • 遵循良好的命名约定和最佳实践