PHP 特色:可变变量

mengkun 6.9K 17

“可变变量”这一概念是 PHP 的特色语法,在其它的编程语言中一般没这种骚操作……

通俗的说,可变变量就是“变量的变量”,一个变量的名,又是一个变量 [晕] 。描述起来很绕,下面直接看代码!

可变变量的使用

要定义一个可变变量很简单,只需在一般的变量前面再加上一个美元符号"$"

  1. <?php  
  2. $hello = '你好';  
  3. $a = 'hello';  
  4.   
  5. echo $$a;  
  6. ?>  

运行上面的代码,输出的是 “你好”。为什么会输出 “你好” 呢,我们来逐句解析。

第一句定义了一个普通的变量 $hello ,值为 “你好”;

第二句也定义了一个普通变脸 $a ,值为 “hello”;

第三句就用上了可变变量 $$a ,因为之前定义的 $a 的值为 “hello”,所以 $$a 就相当于 $hello ,所以最终输出了 “你好”……

让我们再来看下一个例子……

  1. <?php  
  2. $a = 'hello';  
  3. $$a = 'world';  
  4. echo "$a ${$a}";  
  5. ?>  

以上代码中,$a 的内容是 “hello”,$$a 的内容是 “word”。同时,因为 $$a 是一个可变变量,所以它等效于 $hello。因此上述代码也可以写成

  1. <?php  
  2. $a = 'hello';  
  3. $$a = 'world';  
  4. echo "$a $hello";  
  5. ?>  

它们输出的内容都是 “hello world”

可变变量与数组

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

解决此问题的语法是,对第一种情况用 ${$a[1]},对第二种情况用 ${$a}[1]

可变变量与类

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

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

  1. <?php  
  2. // 可变属性示例  
  3. class foo {  
  4.     var $bar = 'I am bar.';  
  5.     var $arr = array('I am A.', 'I am B.', 'I am C.');  
  6.     var $r   = 'I am r.';  
  7. }  
  8.   
  9. $foo = new foo();  
  10. $bar = 'bar';  
  11. $baz = array('foo', 'bar', 'baz', 'quux');  
  12. echo $foo->$bar . "\n";  
  13. echo $foo->$baz[1] . "\n";  
  14.   
  15. $start = 'b';  
  16. $end   = 'ar';  
  17. echo $foo->{$start . $end} . "\n";  
  18.   
  19. $arr = 'arr';  
  20. echo $foo->$arr[1] . "\n";  
  21. echo $foo->{$arr}[1] . "\n";  
  22. ?>  

玩坏了的可变变量

在一个普通的变量前边加一个 “$” 它就变成了可变变量,那么要是在可变变量的前面再加一个 “$” 呢?再加两个,加 N 个呢? 统统没问题……

  1. <?php  
  2.   $Bar = "a";  
  3.   $Foo = "Bar";  
  4.   $World = "Foo";  
  5.   $Hello = "World";  
  6.   $a = "Hello";  
  7.   
  8.   $a// = Hello  
  9.   $$a// => $Hello = World  
  10.   $$$a// => $$Hello => $World = Foo  
  11.   $$$$a// => $$$Hello => $$World = $Foo = Bar  
  12.   $$$$$a// => $$$$Hello => $$$World = $$Foo = $Bar = a  
  13.     
  14.   // 以下相当于进入了循环...  
  15.   $$$$$$a// = Hello  
  16.   $$$$$$$a// = World  
  17.   
  18.   // 只要你愿意,你可以在前面加无数个美元符……  
  19.   $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$a;  
  20.     
  21.   // Ps:据说搞 PHP 开发的都不差钱,因为有很多的 $ ... ...  
  22. ?>  

参考资料

[1].PHP: 可变变量 - Manual.http://www.php.net/manual/zh/language.variables.variable.php

[2].可变变量.百度百科.https://baike.baidu.com/item/%E5%8F%AF%E5%8F%98%E5%8F%98%E9%87%8F

发表评论 取消回复
表情 图片 链接 代码

  1. 干饭王阿牛
    干饭王阿牛 Lv 2

    哈哈哈哈有意思

  2. 南梦宫
    南梦宫 Lv 1

    学到了,php居然还有这种东西

  3. fave
    fave Lv 1

    在调用aliyun_PHP_sdk 有个问题,demo.php 代码require_once('alimedia/alimage.class.php'); function()函数执行后,浏览器页面返回一些值。怎么回收这些值,赋个其他变量或着不让它显示在页面,希望大佬解答一下

  4. 死神影视
    死神影视 Lv 2

    博主,请问写一个百度网盘的视频在线解析播放麻烦不麻烦,我看有好几个接口都提供这个,想了一下大概主要也就是cookie保存到服务器的问题解决掉是最大的问题了。
    比如这个: 视频链接
    查看图片

  5. mengkun
    mengkun Lv 1

    [呲牙] 冒充管理邮箱

    • mengkun
      mengkun 站长

      @mengkun然而管理用的并不是这个邮箱……

  6. 饼干
    饼干 Lv 1

    亲爱的博主 什么时候开放影视站的源代码 很喜欢

  7. 玖月
    玖月 Lv 1

    感谢分享

  8. 瀚宇软件
    瀚宇软件 Lv 3

    PHP竟然有这种“骚操作”! [偷笑]

    • mengkun
      mengkun 站长

      @瀚宇软件震惊!99%的人都不知道的秘密! #(滑稽)

  9. djmingge
    djmingge Lv 2

    ¥¥¥¥¥¥¥哈哈

    • mengkun
      mengkun 站长

      @djmingge好像没有哪种编程语言里使用 RMB 的符号 [wb_二哈]

  10. jwong
    jwong Lv 2

    学习学习,哈哈,希望站长坚持更

    • 广元巴士
      广元巴士 Lv 5

      @jwong已经习惯月经贴

      • mengkun
        mengkun 站长

        @广元巴士每次写完一篇后我也不知道下次会什么时候更 [wb_二哈] 主要看灵感和心情

分享