PHP学习之变量

一、基础

PHP 中的变量用一个美元符号后面跟变量名来表示。变量名是区分大小写的。变量名与 PHP 中其它的标签一样遵循相同的规则。一个有效的变量名由字母或者下划线开头,后面跟上任意数量的字母,数字,或者下划线。注意:$this 是一个特殊的变量,它不能被赋值。

第一种变量赋值方式(默认赋值方式):传值赋值。当将一个表达式的值赋予一个变量时,整个原始表达式的值被赋值到目标变量。这意味着,例如,当一个变量的值赋予另外一个变量时,改变其中一个变量的值(目标变量的值被改变),将不会影响到另外一个变量(原始变量的值不会被改变)。


输出结果:


第二种赋值方式:引用赋值这意味着新的变量简单的引用(换言之,“成为其别名” 或者 “指向”)了原始变量改动新的变量将影响到原始变量,反之亦然。(理解:新变量引用原始变量,即新变量是原始变量的别名或者说新变量指向了原始变量;新变量或原始变量改动任何一个都会影响到另外一个)使用引用赋值,简单地将一个 & 符号加到将要赋值的变量前(源变量)。


输出结果:


注意:有一点重要事项必须指出,那就是只有有名字的变量才可以引用赋值


虽然在 PHP 中并不需要初始化变量,但对变量进行初始化是个好习惯。未初始化的变量具有其类型的默认值 - 布尔类型的变量默认值是False整形和浮点型变量默认值是零字符串型变量默认值是空字符串以及数组变量的默认值是空数组。

二、预定义变量

Note可变变量

超级全局变量不能被用作函数或类方法中的可变变量

Note:

尽管超全局变量和 HTTP_*_VARS 同时存在,但是它们并不是同一个变量,所以改变其中一个的值并不会对另一个产生影响。

如果某些 variables_order 中的变量没有设定,它们的对应的 PHP 预定义数组也是空的。

三、变量范围

变量的范围即它定义的上下文背景(也就是它的生效范围)。大部分的 PHP 变量只有一个单独的范围。这个单独的范围跨度同样包含了 include 和 require 引入的文件。例如:


在用户自定义函数中,一个局部函数范围将被引入。任何用于函数内部的变量按缺省情况将被限制在局部函数范围内。例如:

理解:这里的a只是一个局部变量,但是在自定义的函数内部引用时,如果在函数内部对其重新赋值,否则必须在函数内部将其声明为全局变量,即加上global 关键字。

这个脚本不会有任何输出,因为 echo 语句引用了一个局部版本的变量 $a,而且在这个范围内(函数内部这个范围内),它并没有被赋值。你可能注意到 PHP 的全局变量和 C 语言有一点点不同,在 C 语言中,全局变量在函数中自动生效,除非被局部变量覆盖。这可能引起一些问题,有些人可能不小心就改变了一个全局变量。PHP 中全局变量在函数中使用时必须声明为 global

global 关键字,一个例子:


以上脚本的输出将是“3”。在函数中声明了全局变量 $a 和 $b 之后,对任一变量的所有引用都会指向其全局版本。对于一个函数能够声明的全局变量的最大个数,PHP 没有限制。

全局范围内访问变量的第二个办法,是用特殊的 PHP 自定义 $GLOBALS 数组


 $GLOBALS 是一个关联数组每一个变量为一个元素键名对应变量名,值对应变量的内容。$GLOBALS 之所以在全局范围内存在,是因为 $GLOBALS 是一个超全局变量。以下范例显示了超全局变量的用处:

该例子演绎超全局变量和作用域的例子:


使用静态变量:变量范围的另一个重要特性是静态变量(static variable)。静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。看看下面的例子:


本函数没什么用处,因为每次调用时都会将 $a 的值设为 0 并输出 0将变量加一的 $a++ 没有作用,因为一旦退出本函数则变量 $a 就不存在了。要写一个不会丢失本次计数值的计数函数,要将变量 $a 定义为静态的:


现在,变量 $a 仅在第一次调用 test() 函数时被初始化之后每次调用 test() 函数都会输出 $a 的值并加一

静态变量也提供了一种处理递归函数的方法。递归函数是一种调用自己的函数。写递归函数时要小心,因为可能会无穷递归下去。必须确保有充分的方法来中止递归。以下这个简单的函数递归计数到 10,使用静态变量 $count 来判断何时停止


静态变量可以按照上面的例子声明。如果在声明中用表达式的结果对其赋值会导致解析错误。(不能用表达式的结果对静态变量赋值!)


静态声明是在编译时解析的。注意:在函数之外使用 global 关键字不算错。可以用于在一个函数之内包含文件时。

有点问题!!全局变量和静态变量的引用:对于变量的static 和global 定义是以引用的方式实现的。例如,在一个函数域内部用 global 语句导入的一个真正的全局变量实际上是建立了一个到全局变量的引用。这有可能导致预料之外的行为,如以下例子所演示的:


类似的行为也适用于 static 语句。引用并不是静态地存储的:


上例演示了当把一个引用赋值给一个静态变量时,第二次调用 &get_instance_ref() 函数时其值并没有被记住

三、可变变量

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


一个可变变量获取了一个普通变量的值作为这个可变变量的变量名。在上面的例子中 hello 使用了两个美元符号($)以后,就可以作为一个可变变量的变量了。例如:


这时,两个变量都被定义了:$a 的内容是“hello”并且 $hello 的内容是“world”。因此,以下语句:


可变变量用于数组:要将可变变量用于数组,必须解决一个模棱两可的问题。这就是当写下 $$a[1] 时,解析器需要知道是想要 $a[1]作为一个变量呢,还是想要 $$a 作为一个变量并取出该变量中索引为 [1] 的值。解决此问题的语法是,对第一种情况用 ${$a[1]},对第二种情况用 ${$a}[1]

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

也可使用花括号来给属性名清晰定界。最有用是在属性位于数组中,或者属性名包含有多个部分或者属性名包含有非法字符时

(有点凌乱,求解答,谢谢!)

注意,在 PHP 的函数和类的方法中,超全局变量不能用作可变变量。$this 变量也是一个特殊变量,不能被动态引用

三、来自PHP之外的变量


猜你喜欢

转载自blog.csdn.net/mx_studying/article/details/80876978