基础

PHP 中的变量用美元符号后跟变量名表示。变量名区分大小写。

变量名遵循与 PHP 中其他标签相同的规则。有效的变量名以字母或下划线开头,后跟任意数量的字母、数字或下划线。作为正则表达式,它将这样表达:^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$

注意 这里,字母是指 a-z、A-Z 和字节 128 到 255 (0x80-0xff) 。

注意 $this 是一个特殊变量,不能赋值。在 PHP 7.1.0 之前,间接赋值(例如,使用 可变变量)是可能的。

提示

另请参阅 用户命名指南

有关变量相关函数的信息,请参阅 变量函数参考

<?php
$var
= 'Bob';
$Var = 'Joe';
echo
"$var, $Var"; // 输出 "Bob, Joe"

$4site = 'not yet'; // 无效;以数字开头
$_4site = 'not yet'; // 有效;以下划线开头
$täyte = 'mansikka'; // 有效;'ä' 是 (扩展) ASCII 228。
?>

默认情况下,变量总是按值赋值。也就是说,当你将一个表达式赋给一个变量时,原始表达式的整个值都会被复制到目标变量中。这意味着,例如,在将一个变量的值赋给另一个变量后,更改其中一个变量将不会影响另一个变量。有关此类赋值的更多信息,请参阅有关 表达式 的章节。

PHP 还提供另一种将值赋给变量的方式:按引用赋值。这意味着新变量只是引用(换句话说,"成为原始变量的别名"或"指向")原始变量。对新变量的更改会影响原始变量,反之亦然。

要按引用赋值,只需在要赋值的变量(源变量)的开头添加一个和号 (&)。例如,以下代码片段会输出 'My name is Bob' 两次

<?php
$foo
= 'Bob'; // 将值 'Bob' 赋给 $foo
$bar = &$foo; // 通过 $bar 引用 $foo。
$bar = "My name is $bar"; // 更改 $bar...
echo $bar;
echo
$foo; // $foo 也被更改了。
?>

需要注意的是,只有命名变量可以按引用赋值。

<?php
$foo
= 25;
$bar = &$foo; // 这是一个有效的赋值。
$bar = &(24 * 7); // 无效;引用了未命名的表达式。

function test()
{
return
25;
}

$bar = &test(); // 无效。
?>

在 PHP 中,不需要初始化变量,但这是一个非常好的做法。未初始化变量的默认值为它们的类型,具体取决于它们的使用上下文 - 布尔值默认值为 false,整数和浮点数默认值为零,字符串(例如,用于 echo)被设置为空字符串,数组成为一个空数组。

示例 #1 未初始化变量的默认值

<?php
// 未设置且未引用(没有使用上下文)的变量;输出 NULL
var_dump($unset_var);

// 布尔值用法;输出 'false'(有关此语法的更多信息,请参阅三元运算符)
echo $unset_bool ? "true\n" : "false\n";

// 字符串用法;输出 'string(3) "abc"'
$unset_str .= 'abc';
var_dump($unset_str);

// 整数用法;输出 'int(25)'
$unset_int += 25; // 0 + 25 => 25
var_dump($unset_int);

// 浮点数用法;输出 'float(1.25)'
$unset_float += 1.25;
var_dump($unset_float);

// 数组用法;输出 array(1) { [3]=> string(3) "def" }
$unset_arr[3] = "def"; // array() + array(3 => "def") => array(3 => "def")
var_dump($unset_arr);

// 对象用法;创建一个新的 stdClass 对象(参见 https://php.net/manual/en/reserved.classes.php)
// 输出:object(stdClass)#1 (1) { ["foo"]=> string(3) "bar" }
$unset_obj->foo = 'bar';
var_dump($unset_obj);
?>

依赖未初始化变量的默认值在将一个文件包含到另一个使用相同变量名的文件中时会出现问题。如果使用未初始化变量,则会发出 E_WARNING(在 PHP 8.0.0 之前,为 E_NOTICE)级别的错误,但不会在将元素追加到未初始化数组的情况下发出。可以使用 isset() 语言结构来检测变量是否已经初始化。

添加注释

用户贡献的注释 2 个注释

jeff dot phpnet at tanasity dot com
13 年前
此页面应该包含关于变量生命周期的注释。

在使用变量之前,它并不存在。它未设置。可以使用 isset() 检查变量是否不存在。只要变量存在且未设置为 null,它就会返回 true。除了 null 之外,变量所持有的值在确定变量是否已设置方面不起作用。

将现有变量设置为 null 是取消设置变量的一种方法。另一种方法是使用 unset() 结构销毁变量。

<?php
print isset($a); // $a 未设置。输出 false。(或更准确地说,输出 ''。)
$b = 0; // isset($b) 返回 true(或更准确地说 '1')
$c = array(); // isset($c) 返回 true
$b = null; // 现在 isset($b) 返回 false;
unset($c); // 现在 isset($c) 返回 false;
?>

is_null() 等效于检查 isset() 是否为 false 的测试。

变量在作用域中首次使用时,会自动创建。此后 isset 为 true。在创建时,它也会根据上下文接收一个类型。

<?php
$a_bool
= true; // 布尔值
$a_str = 'foo'; // 字符串
?>

如果在没有赋值的情况下使用变量,则它将未初始化并接收该类型的默认值。默认值为 _空_ 值。例如,布尔值默认为 FALSE,整数和浮点数默认为零,字符串默认为空字符串 '',数组默认为空数组。

可以使用 empty(); 测试变量是否为空。

<?php
$a
= 0; // 此处 isset,但为空
?>

未设置的变量也为空。

<?php
empty($vessel); // 返回 true。另外,$vessel 未设置。
?>

以上所有内容也适用于数组元素。

<?php
$item
= array();
// 现在 isset($item) 返回 true。但 isset($item['unicorn']) 为 false。
// empty($item) 为 true,empty($item['unicorn']) 也是如此

$item['unicorn'] = '';
// 现在 isset($item['unicorn']) 为 true。empty($item) 为 false。
// 但 empty($item['unicorn']) 仍然为 true;

$item['unicorn'] = 'Pink unicorn';
// isset($item['unicorn']) 仍然为 true。empty($item) 仍然为 false。
// 但现在 empty($item['unicorn']) 为 false;
?>

对于数组,这一点很重要,因为访问不存在的数组项可能会触发错误;您可能希望在使用数组和数组项之前使用 isset 测试它们是否存在。
anisgazig at gmail dot com
3 年前
关于变量声明规则和分类的清晰概念

变量声明规则

1. 以美元符号 ($) 开头
2. 变量名的第一个字母来自 a-zA-z_
3. 变量名的后续字母来自 a-zA-Z0-9_
4. 不允许空格或语法

变量分类

变量主要分为两种类型
1. 预定义变量
2. 用户定义变量

预定义变量
PHP 8 中有 12 个预定义变量
1. $GLOBALS
2. $_SERVER
3. $_REQUEST
4. $_FILES
5. $_ENV
6. $_SESSION
7. $_COOKIE
8. $_GET
9. $_POST
10. $http_response_header
11. $argc
12. $argv

用户定义变量
用户定义变量有 3 种类型
1. 变量作用域
2. 变量变量
3. 引用变量

变量作用域
变量作用域有 3 种类型
1. 局部作用域
2. 全局作用域
3. 静态变量
To Top