站长资讯网
最全最丰富的资讯网站

@PHP变量详解(4)

PHP 中一个美元符号后面跟上一个变量名称,即表示一个变量。变量的名称是对大小写敏感的。变量名与 PHP 中其它的标签一样遵循相同的规则。一个有效的变量名由字母或者下划线开头,后面跟上任意数量的字母,数字,或者下划线。按照正常的正则表达式,它将被表述 为:'[a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*’

AD:

全局和静态变量的引用

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

<?php function test_global_ref() {    global $obj;    $obj = &new stdclass; }  function test_global_noref() {    global $obj;    $obj = new stdclass; }  test_global_ref(); var_dump($obj); test_global_noref(); var_dump($obj); ?> 

执行以上例子会导致如下输出:

NULL object(stdClass)(0) { } 

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

<?php function &get_instance_ref() {    static $obj;     echo "Static object: ";    var_dump($obj);    if (!isset($obj)) {        // 将一个引用赋值给静态变量        $obj = &new stdclass;    }    $obj->property++;    return $obj; }  function &get_instance_noref() {    static $obj;     echo "Static object: ";    var_dump($obj);    if (!isset($obj)) {        // 将一个对象赋值给静态变量        $obj = new stdclass;    }    $obj->property++;    return $obj; }  $obj1 = get_instance_ref(); $still_obj1 = get_instance_ref(); echo "n"; $obj2 = get_instance_noref(); $still_obj2 = get_instance_noref(); ?> 

执行以上例子会导致如下输出:

Static object: NULL Static object: NULL  Static object: NULL Static object: object(stdClass)(1) {   ["property"]=>   int(1) } 

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

可变变量

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

?<php $a = "hello"; ?> 

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

<?php $$a = "world"; ?>   

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

<?php echo "$a ${$a}"; ?>   

以下写法更准确并且会输出同样的结果:

<?php echo "$a $hello"; ?>  

它们都会输出:hello world。

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

注意可变变量不能用于 PHP 的超全局变量数组。这意味着不能这样用:${$_GET}。 如果想要一种处理超全局变量和老的 HTTP_*_VARS 的方法,应该尝试引用它们。

赞(0)
分享到: 更多 (0)
网站地图   沪ICP备18035694号-2    沪公网安备31011702889846号