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 条评论
登录 后参与评论

相关文章

来自专栏LinkedBear的个人空间

【源码分析】面试问烂的equals和各种字符串、Integer比较

今天在空闲时间聊天时发现,面试题中的equals问题,以及String、Integer等的判等问题还是讨论的比较激烈而且混乱。。。(滑稽)

1033
来自专栏菜鸟前端工程师

JavaScript学习笔记022-原型链0原型继承0对象的深浅拷贝extends

551
来自专栏技术博客

C#类和结构体的异同点简单总结

类和结构的异同点? 异:  1.关键字不同 一个是class,一个是struct     2.类型不同,一个是引用类型,一个是值类型(一个堆区,一个栈区)   ...

1432
来自专栏猿人谷

strcpy函数和strncpy函数的区别

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

2326
来自专栏阿凯的Excel

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

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

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

第十三天 面向对象-final static 匿名对象内部类包代码块【悟空教程】

1284
来自专栏测试开发架构之路

C++之多态的一个例子

[例12.1] 先建立一个Point(点)类,包含数据成员x,y(坐标点)。以它为基类,派生出一个Circle(圆)类,增加数据成员r(半径),再以Circle...

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

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

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

733
来自专栏marsggbo

c++学习笔记之封装篇(上)

一、类对象 假设我们由Tv这个类,定义如下 注意class结尾要加上分号 class Tv() { int width; int hei...

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

11.程序编程基础5:输入输出

python提供了3种输入输出标准文件对象,分别为标准输入、标准输出和标准错误;分别对应了sys模块中的sys.stdin,sys.stdout,sys.std...

822

扫码关注云+社区