php之变量笔记

本文介绍了PHP变量规则,如以$开头、名称规则及大小写敏感等,还阐述了变量作用域,包括局部、全局和静态作用域。同时讲解了global和static关键词的使用,global用于函数内访问全局变量,static可保留局部变量信息,指出全局变量无需用static。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、PHP 变量规则:
变量以 $ 符号开头,其后是变量的名称
变量名称必须以字母或下划线开头
变量名称不能以数字开头
变量名称只能包含字母数字字符和下划线(A-z、0-9 以及 _)
变量名称对大小写敏感($y 与 $Y 是两个不同的变量)

代码举例:

  • 变量以 $ 符号开头,其后是变量的名称
<?php
$a = 1;
$b = 2;
$c = 3;
echo $a+$b+$c;
?>

运行结果:

6
  • 变量名称必须以字母或下划线开头
<?php
$a = 1;
$_ = 2;
$_a = 3;
echo $a."<br/>";
echo $_."<br/>";
echo $_a;
?>

运行结果:

1
2
3
  • 变量名称不能以数字开头
<?php
$1 = 2;
?>

运行结果:

报错内容:
Parse error: syntax error, unexpected '1' (T_LNUMBER), expecting variable (T_VARIABLE) or '{' or '$' in F:\xampp\htdocs\test\phptest.php on line 2
  • 变量名称只能包含字母数字字符和下划线(A-z、0-9 以及 _)
<?php
$a = 1;
$a1 = 2;
$_a = 3;
$_1 = 4;
$a_1 = 5;
echo $a."<br/>";
echo $a1."<br/>";
echo $_a."<br/>";
echo $_1."<br/>";
echo $a_1;
?>

运行结果:

1
2
3
4
5
  • 变量名称对大小写敏感($y 与 $Y 是两个不同的变量)
<?php
$a = 1;
$A = 2;
$ab = 3;
$AB = 4;
echo $a."<br/>";
echo $A."<br/>";
echo $ab."<br/>";
echo $AB;
?>

运行结果:

1
2
3
4

注:以上的举例中,我们不需要声明变量的数据类型,php会根据变量的值,自动把变量转换为正确的数据类型

二、php变量作用域
在 PHP中,可以在脚本的任意位置对变量进行声明。
变量的作用域指的是变量能够被引用/使用的那部分脚本(就是那部分脚本中包含局部变量,全局变量或静态变量就叫做变量的作用域)

PHP 有三种不同的变量作用域:

  • local(局部)
  • global(全局)
  • static(静态)

Local 和 Global 作用域:
函数之外声明的变量拥有 Global 作用域,只能在函数以外进行访问。
函数内部声明的变量拥有 LOCAL 作用域,只能在函数内部进行访问。
下面的例子测试了带有局部和全局作用域的变量:

<?php
$x=5; // 全局作用域

function myTest() {
  $y=10; // 局部作用域
  echo "<p>测试函数内部的变量:</p>";
  echo "变量 x 是:$x";   //因为$x是在函数myTest外部声明的变量,所以$x只能在函数外访问到
  echo "<br/>";   //换行
  echo "变量 y 是:$y";   //因为$y是在函数myTest内部声明的变量,所以$y只能在函数内访问到
} 

myTest();   // 运行myTest函数

echo "<p>测试函数之外的变量:</p>";
echo "变量 x 是:$x";   //因为$x是在函数myTest外部声明的变量,所以$x只能在函数外访问到
echo "<br/>";   //换行
echo "变量 y 是:$y";   //因为$y是在函数myTest内部声明的变量,所以$y只能在函数内访问到
?>

运行结果:

测试函数内部的变量:


Notice: Undefined variable: x in F:\xampp\htdocs\test\phptest.php on line 7
变量 x 是:
变量 y 是:10
测试函数之外的变量:

变量 x 是:5

Notice: Undefined variable: y in F:\xampp\htdocs\test\phptest.php on line 17
变量 y 是:

注:你可以在不同的函数中创建名称相同的局部变量,因为局部变量只能被在其中创建它的函数所识别

三、PHP global 关键词

  • global 关键词用于在函数内访问全局变量
    要做到这一点,请在(函数内部)变量前面使用 global 关键词:
<?php
$x=5;   //声明一个$x变量,给它赋值5
$y=10;   //声明一个$y变量,给它赋值10

function myTest() {   //创建一个myTest函数
  global $x,$y;   //使用global关键词,使函数内部可以使用$x与$y变量
  $y=$x+$y;   //计算$y=5+10,即最后$y=15
}

myTest();   //执行myTest函数
echo $y;   //输出15
?>

运行结果:

15
  • PHP 同时在名为 $GLOBALS[index] 的数组中存储了所有创建的全局变量。下标存有变量名。这个数组在函数内也可以访问,并能够用于直接更新全局变量
    举例:
<?php
$x=5;   //声明一个变量x,赋值为5
$y=10;   //声明一个变量y,赋值为10

function myTest() {   //定义一个myTest函数
  $GLOBALS['y']=$GLOBALS['x']+$GLOBALS['y'];   //直接在函数内部使用全局变量,不需要再global关键词
  $GLOBALS['x']=8;   //在函数内部把全局变量$x重新赋值8(验证函数内部是否可以直接更新全局变量)
} 

myTest();   //执行myTest函数
echo $x;   //输出为8,表明更新成功,这里更新是在$GLOBALS['y']=$GLOBALS['x']+$GLOBALS['y']之后更新的,所以当时的$x还是=5
echo "<br/>";   //换行
echo $y;   //输出为15
?>

运行结果:

8
15

四、PHP static 关键词

  • 通常,当函数完成/执行后,会删除所有变量与它的值。不过,有时我需要不删除某个局部变量,要完成这一点,请在您首次声明变量时使用 static 关键词:
    然后,每当函数被调用时,这个局部变量所存储的信息都是函数最后一次被调用时所包含的信息
<?php
$x=0;
echo $x."<br/>";   //输出变量值为0   注:变量换行可以使用echo $x."<br/>"或echo "<br/>"
$x++;   //在$x变量现有值的基础上+1
echo $x;   //输出变量值为$x=0+1.结果为1
echo "<br/>";
$x++;   //输出变量值$x=1+1,结果为2
echo $x."<br/>"."<br/>";

function myTest() {   //定义一个myTest函数
   static $y=1;   //使用static关键词
   echo $y;   //输出变量$y的值
   $y++;   //在变量$y现有值的基础上+1
}

myTest();   //执行第一次myTest函数,使用了static关键词,并为$y赋值1,所以输出$y的结果为1,之后执行$y++,因此$y=1+1,$y变为2,此时myTest函数运行结束,本该删除局部变量$y与其值,但因为使用了static关键词,所以不删除局部变量$y与其值,所以此时$y已经变成了2,也就是static $y=2啦
echo "<br/>";   //函数执行换行必须使用echo "<br/>",使用myTest()."<br/>"无法换行
myTest();   //执行第二次myTest函数,因为使用了static关键词,第一次函数执行后,static $y被赋值了2,所以输出$y的结果为2,之后执行$y++,此时$y已经变成了3
echo "<br/>";
myTest();   //执行第三次myTest函数,因为使用了static关键词,第二次函数执行后,static $y被赋值了3,所以输出$y的结果为3,之后执行$y++,此时$y已经变成了4
echo "<br/>";   
myTest();   //执行第四次myTest函数,因为使用了static关键词,第三次函数执行后,static $y被赋值了4,所以输出$y的结果为4,之后执行$y++,此时$y已经变成了5
echo "<br/>";
myTest();    //执行第五次myTest函数,因为使用了static关键词,第四次函数执行后,static $y被赋值了5,所以输出$y的结果为5,之后执行$y++,此时$y已经变成了6,但是下面没有myTest函数再运行了,所以也就显示到5,但此时的static $y=6,你再执行一次myTest,就会输出6,接下来的流程就和上面几次的函数执行一样啦~
echo "<br/>";
?>

运行结果:

0
1
2

1
2
3
4
5
  • 如果函数内的局部变量不使用static关键字,会是什么样呢?
<?php
function myTest() {   //定义一个myTest函数
   $y=1;   //不使用使用static关键词
   echo $y;   //输出变量$y的值
   $y++;   //在变量$y现有值的基础上+1
}

myTest();   //执行第一次函数,首先执行第三行代码,局部变量$y赋值1,之后输出$y=1,再加1,因为是局部变量,不进行$y更新,直接完成myTest函数,删除$y变量与其值(删除了$y也就相当于删除了值)
echo "<br/>";
myTest();   //执行第二次函数,首先执行第三行代码,因为第一次函数的执行完成后直接删除了局部变量$y和其值,所以重新声明并赋值1,之后输出$y=1,再加1,因为是局部变量,不进行$y更新,直接完成myTest函数,删除$y变量与其值(删除了$y也就相当于删除了值)

运行结果:

1
1
  • 代码测试段,看看全局变量是否可以使用static关键词:
<?php
//static $y=0;   //在全局变量作用域使用static关键词
//$y=0;          //在全局变量作用域不使用static关键词
#以上注释的两行代码每次测试二选一(选取一行取消注释)进行测试
function myTest() {   //定义一个myTest函数
   echo $GLOBALS['y'];   //这里输出全局变量$y
   $GLOBALS['y']++;   //这里把更新全局变量$y,使它+1,就是函数外面的全局变量$y+1,变成了一个新的数值
}

myTest();   //执行第一次函数,首先执行第六行代码,输出全局变量$y=0,再加1,因为使用的是$GLOBALS[],所以更新全局变量$y,此时$y=1
echo "<br/>";
myTest();   //执行第二次函数,首先执行第六行代码,因为第一次的函数执行,全局变量$y变成了1,所以输出全局变量$y=1,再加1,因为使用的是$GLOBALS[],所以更新全局变量$y,此时$y=2
echo "<br/>";
myTest();   //执行第三次函数,首先执行第六行代码,因为第二次的函数执行,全局变量$y变成了2,所以输出全局变量$y=2,再加1,因为使用的是$GLOBALS[],所以更新全局变量$y,此时$y=3
echo "<br/>";   
myTest();   //执行第四次函数,首先执行第六行代码,因为第三次的函数执行,全局变量$y变成了3,所以输出全局变量$y=3,再加1,因为使用的是$GLOBALS[],所以更新全局变量$y,此时$y=4
echo "<br/>";
myTest();   //执行第五次函数,首先执行第六行代码,因为第四次的函数执行,全局变量$y变成了4,所以输出全局变量$y=4,再加1,因为使用的是$GLOBALS[],所以更新全局变量$y,此时$y=5
echo "<br/>";

以上注释的两行代码先使用第二行代码,之后注释第一行代码,选用第三行代码,运行结果都是一样的,为什么呢?
因为,不管全局变量使没使用static关键词,函数里的$GLOBALS[]都会更新全局变量$y,使函数外的全局变量$y变成一个新值。(也就是说虽然myTest函数完成后会删除函数内部的的所有变量与其值,但是它的值已经被$GLOBALS[]更新,一个新值已经赋给了全局变量$y,它又不会删除,就这样依次循环啦)

有人就要问了,为什么不在函数内使用全局变量$y,请问,如果使用了全局变量$y,不使用$GLOBALS[],你在函数内可以获得全局变量吗!!!
所以,虽然static关键字可以在函数外(在全局变量上使用),但最终的运行结果跟它是没有关系的(因为函数里的$GLOBALS[]更新了全局变量$y,还要static有啥用…),所以全局变量使不使用static关键字,都无所谓

最后,结果就是:全局变量不要使用static关键字(个人理解),只对函数中的局部变量使用,因为局部变量不会自己更新变量值,函数运行后就会删除变量与其值!!!

注:笔记总结于 http://www.w3school.com.cn/php/php_variables.asp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1stPeak

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值