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

相关文章

来自专栏陈树义

从 HelloWorld 看 Java 字节码文件结构

很多时候,我们都是从代码层面去学习如何编程,却很少去看看一个个 Java 代码背后到底是什么。今天就让我们从一个最简单的 Hello World 开始看一看 J...

3827
来自专栏mwangblog

python类(一)

1223
来自专栏星回的实验室

js重修课[三]:对象

这一章相对来说是部重头戏,看完之后才发现用了这么久的js,却很少有用真正OO的思想在写js代码……

884
来自专栏前端儿

ES6笔记(6)-- Set、Map结构和Iterator迭代器

JS中的iterator也有类似的功能,JS内部为一些数据结构实现了iterator迭代器的接口,让我们可以方便的使用

851
来自专栏noteless

[四] java虚拟机JVM编译器编译代码简介 字节码指令实例 代码到底编译成了什么形式

前文已经对虚拟机进行过了简单的介绍,并且也对class文件结构,以及字节码指令进行了详尽的说明

1082
来自专栏梧雨北辰的开发录

Swift学习:构造器(下)

本篇主要介绍Swift中构造器的一些特殊用法 一、可失败的构造器 顾名思义,这是用于我们构造过程可能失败情况的构造器。失败的原因可能是给构造器传入无效的参数值,...

2437
来自专栏King_3的技术专栏

leetcode-139-单词拆分(递归超时,动归解决)

给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。

751
来自专栏闵开慧

java概念1

public static void main(String[] args) {//其中[]也可以写在args后面,args也可以随便写成其他字母,例如asd...

32811
来自专栏陈满iOS

iOS基础:全局变量·静态变量·局部变量·自动变量(static、extern、全局静态区、堆区、栈区)

区分三种变量的特点,如果只看声明位置和访问范围,肯定不够深刻的,需要进一步理解在内存中的不同。所以,这里我们来复习总结一下三种变量的特点,区分巩固基础知识。

913
来自专栏专注 Java 基础分享

虚拟机字节码执行引擎

所谓的「虚拟机字节码执行引擎」其实就是 JVM 根据 Class 文件中给出的字节码指令,基于栈解释器的一种执行机制。通俗点来说,也就是 JVM 解析字节码指令...

4168

扫码关注云+社区