PHP学习(3) 变量

在上一篇里说了变量是以美元符号($)作为前缀的标识符。如:$name。
变量可以存放任何类型的值;在PHP中没有显示的语法来声明变量。第一次使用变量时,变量就被创建了。

1. 变量的变量
变量的变量,即把一个变量名存在另一个变量中,如:

PHP
<?php
$name = 'value';
$$name = '1234';

执行后,会创建一个$value的变量,它的值为'1234'。

2. 变量引用

在PHP中,变量也和指针差不多。变量引用表示把两个变量指向同一个值,别名的意思差不多吧。
因为是指向同一个地址,所以更改其中一个变量的值,另一个变量也会改变。要注意的是重设一个变量不会对改变另一个变量,这是因为重设变量只是把变量指向NULL,而没有修改另一个变量所指向的值。
函数的参数以及返回值都可以是一个变量引用,这样可以防止复制很大的数据类型(如:字符串、数组、类)。

示例代码:

PHP
<?php
// 更改其中一个变量的值
$value_a = 'Test';
$value_b = & $value_a;
$value_b = 'Change';
print "$value_a is $value_a";
print "$value_b is $value_b";
// 重设一个变量
unset($value_b);
print "$value_a is $value_a";
print "$value_b is $value_b";

function &ret_ref(&$val) {         //&是必须的
    $val = 'functionValue';
    return $val;
}
$v1 = 'Hello';
$v2 = &ret_ref($v1);              //&是必须的
print "$v1 is $v1";
print "$v2 is $v2";

结果为:

$value_a is Change
$value_b is Change
$value_a is Change
$value_b is
$v1 is functionValue
$v2 is functionValue

3. 变量作用域

PHP中有两种变量作用域:全局作用域和局部作用域。
在函数的参数以及在函数内在申明的静态或者动态变量都是局部作用域。
只有用global申明的才是全局变量,当然全局变量还有一种访问方法,就是用$GLOBALS数组来访问。
在函数内部申明的静态变量由函数所有,不会被回收,每次访问该函数时会访问同一变量地址。

示例代码:

PHP
<?php
$count = 30;
$g_value1 = 10;        //全局变量
$g_value2 = 20;
function update_count() {
    $count++;
    global $g_value1;
    $g_value1++;
    $GLOBALS[g_value2]++;
    static $s_value = 0;
    $s_value++;
    print "$s_value is $s_value";
}
update_count();
print "$count is $count";
print "$g_value1 is $g_value1";
print "$g_value2 is $g_value2";
update_count();

结果为:

$s_value is 1
$count is 30
$g_value1 is 11
$g_value2 is 21
$s_value is 2

4. 垃圾收集

PHP用引用计算和写时复制来管理内存。写时复制确保在变量之间复制值时不浪费内存;引用计算确保在引用不再需要时将内存返回给操作系统。
先说说写时复制,比如下面的代码

PHP
<?php
$worker = array("Fred", 35, "Test");
$other = $worker;               // 数组没有被复制
$other[1] = 36;                 // 因为值发生变化,数据被复制

引用计算是指变量不再被使用时,会被回收。在PHP中,可以用unset($x)来删除一个变量的值,回收变量指向的内存。


参考资料:
PHP程序设计,2003,第二章 语言基础,数据类型

转载请注明:宇托的狗窝 » PHP学习(3) 变量

发表我的评论
取消评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址