PHP 特色:可变变量

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

通俗的说,可变变量就是“变量的变量”,一个变量的名,又是一个变量

。描述起来很绕,下面直接看代码!

可变变量的使用

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

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

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

第一句定义了一个普通的变量 $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. $foo = new foo();  
  9. $bar = 'bar';  
  10. $baz = array('foo', 'bar', 'baz', 'quux');  
  11. echo $foo->$bar . "\n";  
  12. echo $foo->$baz[1] . "\n";  
  13. $start = 'b';  
  14. $end   = 'ar';  
  15. echo $foo->{$start . $end} . "\n";  
  16. $arr = 'arr';  
  17. echo $foo->$arr[1] . "\n";  
  18. echo $foo->{$arr}[1] . "\n";  
  19. ?>  

玩坏了的可变变量

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

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

参考资料

[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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏互联网杂技

js的隐含参数(arguments,callee,caller)使用方法

在提到上述的概念之前,首先想说说javascript中函数的隐含参数: arguments arguments 该对象代表正在执行的函数和调用它的函数的参数。[...

3506
来自专栏阿凯的Excel

Python读书笔记16(循环大法好!while少不了)

今天和大家分享一个新的循环语句while! 之前学过for循环语句用于遍历列表、元组、字典内的值,我们重温一下! ? 这种for循环语句是根据列表元素值的数量来...

3715
来自专栏烂笔头

Python标准库笔记(4) — collections模块

目录[-] 这个模块提供几个非常有用的Python容器类型 1.容器 名称 功能描述 OrderedDict 保持了key插入顺序的di...

3437
来自专栏owent

POJ 3267 The Cow Lexicon 解题报告

1.可以令 deleteNum[pos]为输入字符串在pos处需要删除的最少字符数量;

682
来自专栏linux驱动个人学习

如何使用C语言的面向对象

我们都知道,C++才是面向对象的语言,但是C语言是否能使用面向对象的功能? (1)继承性 1 typedef struct _parent 2 { 3 int ...

3685
来自专栏Java帮帮-微信公众号-技术文章全总结

第二十天 IO-异常file类【悟空教程】

在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象。Java处理异常的方式是中断处理。

1255
来自专栏WindCoder

Java基础小结(一)

1、default (即缺省,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。

871
来自专栏猿人谷

strcpy函数和strncpy函数的区别

strcpy函数和strncpy函数的原型介绍在我的另一篇文章中介绍了,见strcpy,strncpy,strlen等函数原型 strcpy:字串复制  ...

2476
来自专栏我和PYTHON有个约会

19. 再说函数~那些不得不知道的事儿

前面的课程中,我们已经对函数有了简单的了解 函数的声明、函数的的调用、函数的参数以及返回值等等

753
来自专栏北京马哥教育

Python爬虫基础知识:Python中的正则表达式教程

云豆贴心提醒,本文阅读时间7分钟 正则表达式在Python爬虫中的作用就像是老师点名时用的花名册一样,是必不可少的神兵利器。 一、 正则表达式基础 1.1.概...

2606

扫码关注云+社区