Summary

概述

什么是变量?变量的作用和用途?变量在底层的原理?

什么是变量

变量是用来临时存储某些值的“容器”,这些值可以是数字、文本、或者复杂的排列组合。变量在任何语言中都处于核心地位,完全理解它的概念和掌握使用它的技巧,将是你能否精通此语言的重要因素。

变量也指在程序的运行过程中随时发生改变的量。它可以将你需要在程序中使用的复杂数据都起一个“名字”,这样简短的名字就可以在程序的许可范围内随意使用它所代表的值,亦可随意改变或删除,从而降低代码复杂度,这正是它的意义所在。

PHP中最基本的数据存储单元就是变量和常量,可以存储不同类型的数据。由于PHP是一种弱类型检查的语言,变量和常量的赋值常常会根据代码的执行顺序决定。正是由于这个原因,导致PHP的语法和一些强类型语言(C,JAVA等语言)有着很大的不同。

变量的原理

程序上的变量声明,在服务器中运行时,会在服务器中的内存中划分出两个空间:一个空间存放变量名(栈空间);一个空间存放变量的值(堆空间);取值过程就是:先从一根内存的变量表找到变量名,再通过变量名其地址属性指向另一根内存里获取值。

这里只做基本的概念引导,再讲就超纲了对新入门的同学来说也没什么意义,关于PHP底层的内容,请到相关博客页面中查看。

Declare Variable

声明变量和赋值

在PHP这种弱类型语言中要如何声明一个变量?

在PHP中我们可以声明和使用变量,PHP的特性就是它不会要求在使用变量之前先声明变量,也就是说,当我们第一次给一个变量直接赋值的同时,你就声明了这个变量。一旦你创建了这个变量,你就可以在脚本中随意使用它,改变它的值或直接删除它,是对变量的基本操作。

在PHP中声明变量时必须使用美元符号 $ 作为开始,后面跟这个变量的名称。赋值直接用等号 =。比如,我想声明一个名为“name”,值为“wowphp”的变量,就可以这么写:$name = 'wowphp'; 。声明之后,就可以在之后的代码中使用了。请看下面几个例子:


<?php
// 声明一个变量 nums 并将其赋值为整型的666
$nums = 666;
// 声明一个变量 name 并将其赋值为字符串型的wowphp
$name = 'wowphp';
// 声明一个变量 bool 并将其赋值为布尔型的false
$bool = false;
// 声明一个变量 float 并将其赋值为浮点型的12.99
$float = 12.99;

// 批量声明和赋值
$string1 = $string2 = $string3 = 'Many strings';

// 使用其中一个变量
echo $name;
        

需要注意的是,前文提到过,变量的赋值和PHP的执行顺序有关,当你不停的对同一个变量赋不同的值时,PHP将会以你最后一次的值为准。比如:


<?php
// 多次对 $num 进行赋值
$num = 1;
$num = 2;
$num = 3;
$num = 4;
$num = 5;

echo $num; // 结果为5
        

变量的命名规范

命名变量很简单,但是变量名一定要有意义,并且还要符合一定的规范,否则自己都会被自己绕进去甚至程序会报错。

变量名是严格区分大小写的。相同单词如果用不同的大小写来声明变量的话,输出的值也是不一样的。如:


<?php
// 单词相同 但大小写不同的变量
$name = 'WOWPHP';
$Name = 'VAGH';
$NAME = 'Penny';

echo $name; // 输出 WOWPHP
echo $Name; // 输出 VAGH
echo $NAME; // 输出 Penny
        

以上,$name$Name$NAME 都代表着不同的值。除变量的命名外,PHP的其他标签也需要遵循类似于这种的命名原则。一个有效的变量名由字母或下划线开头,后面跟着任意数量的字符。官方提供了一个正则来定义这样的规则:[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]* 懂正则表达式的同学可以看出来,PHP是支持以包含中文字符来命名变量的,但是我不认同也不建议使用中文来命名变量名。如下:


<?php
// 正确的两个命名变量的方法
$name = 'WOWPHP';
$_name = 'WOWPHP';
// 不可以使用数字开头的变量名
$7name = 'WOWPHP';
// 可以使用下划线开头的变量名
$_7name = 'WOWPHP';
// 可以使用包含中文的名称作为变量名 但我不建议这么做
$my名字 = 'WOWPHP';
        

PHP中有一些特殊名称是系统自定义的,也成为关键字。是PHP组成语言不可或缺的一部分。因此不能使用它们来命名变量、常量、函数名和类名。但是和其他语言不同,PHP支持以关键字的名称来命名变量。当然,我依旧不建议这样做。除非你分辨能力很好。

下表是PHP语言中常见的关键字,不建议以它们作为函数名称!

and or xor if else for
foreach while do switch case break
continue default as elseif declare endif
endfor endforeach endwhile endswitch enddeclare array
static const class extends new execption
global function exit die echo print
eval isset unset return define defined
include include_onece require require_onece cfunction use
var public private protected implements interface
extends namespace abstract try cache throw
variables Variable

可变变量和引用赋值

有时候使用可变变量名是很方便的。就是说,一个变量的变量名可以动态的设置和使用。一个普通的变量通过声明来设置。

可变变量

您有没有想过,变量名也可以用变量来替代呢?这听起来获取有点绕,但是在实际的需求实现中,这种操作很常见。PHP可以让变量的名称也是一个变量,用文字来说可能越说越乱,请仔细看下面的代码:


<?php
$name = 'wowphp';
// 两个$符代表了一个可变变量 相当于$wowphp
$$name = ' is awesome!';

echo $name.$wowphp; // 输出 wowphp is awesome!
        

上述例子中,因为 $name 已经被定义为 “wowphp”, 所以 $$name$wowphp 是等价的。

类的属性也可以通过可变属性名来访问。可变属性名将在该调用所处的范围内被解析。例如,对于 $foo->$bar 表达式,则会在本地范围来解析 $bar 并且其值将被用于 $foo 的属性名。对于 $bar 是数组单元时也是一样。

引用赋值

正常情况下,当一个变量等于一个定义好的变量时,再次对其发生改变是不会影响原有变量的值的。如下方示例代码中示例一,$numfix = $num 代表 numfix 的值等于 num 的值等于 100,不管怎么对 numfix 的值发生改变,num的值永远都是 100。

那么什么是引用赋值呢?引用赋值和正常的赋值的区别就在于,正常情况下,只是将变量的值传递给了另外一个变量。而引用赋值则相当于给这个变量起了一个别名,或者说“指向”了原始变量。不管其中任何一个变量的值发生了改变,那么每一个变量的值都会发生改变。没有看懂的话请直接看下面的代码(示例二):


<?php
// 例子一
$num = 100;
// 更改$numfix的值
$numfix = $num;
echo $numfix; // 结果为 100;
$numfix = 200;
echo $num; // 结果依然为 100;

// 例子二
$num = 100;
// 将$num 引用赋值给 $numfix
$numfix = &$num;
// 更改$numfix的值
$numfix = 200;
echo $num; // 结果为200
        

在PHP中,变量的引用赋值只需要在要引用的变量(源变量)名前加一个 & 符。这种赋值方法将会高效的提高赋值效率。在很多现实需求中都会广泛的应用。需要注意的是,引用赋值只能对有名字的变量生效,直接给运算表达式赋值是没有效果的。如:$num = &(40+70);

另外,PHP的引用并不像C语言的地址指针。在上述代码中,$numfix = &$num; 不会导致 $numfix 和 $num 在内存上同体,只是把各自的值关联起来。基于这一点,即使删除了这个引用的变量的值,也不会删除源变量的值。如:


<?php
$num = 100;
$numfix = &$num;
// 删除$numfix
unset($numfix);
// num依旧保留 值为 100
echo $num;
        

请登录

WOWPHP 账号登录 GitHub 账号登录

还没有账号?现在去注册一个~