
class foo { var $bar = 'I am bar.'; var $arr = array('I am A.', 'I am B.', 'I am C.'); var $r = 'I am r.'; } $foo = new foo(); $bar = 'bar'; $baz = array('foo', 'bar', 'baz', 'quux'); echo $foo->$bar . "\n"; //$bar 的值是 bar ,$foo->bar 的值是 I am bar echo $foo->$baz[1] . "\n"; //I am bar. $start = 'b'; $end = 'ar'; echo $foo->{$start . $end} . "\n";//$start 的值是'b' ,$end 的值是'ar' ,{$start . $end}的值是 'bar',$foo->{$start . $end} 的值是'I am bar.' $arr = 'arr'; echo $foo->$arr[1] . "\n";// $arr 的值是 'arr' ,$arr[1] 的值是 r $foo->$arr[1]的值是 'I am r.'。 echo $foo->{$arr}[1] . "\n";// 我理解:$arr 的值是 'arr' ,{$arr}[1] 的值是 r $foo->$arr[1]的值是 'I am r.'。但实际输出是 I am B.不太理解这里的运算优先级是什么情况。查手册运算符优先级里面没有 -> ... 最后一行实在理解不了为什么输出 I am B ...
1 cz208209 Mar 24, 2016 php 中的大括号 有一个用法是界定变量的界限,也可以界定表达式{$arr} = 'arr',网上都有总结 |
2 cz208209 Mar 24, 2016 还有你这个 类里面用的 var php5*差不多都淘汰了,建议你换高的版本 |
3 wayne712 Mar 24, 2016 在 php 中使用 var 声明类成员属性是 php4 时代的写法, 另外$arr 与{$arr}结果一致没有什么不妥。 |
4 iyaozhen Mar 24, 2016 |
5 iyaozhen nbsp; Mar 24, 2016 @iyaozhen $$foo['bar']['baz'] // interpreted as ($$foo)['bar']['baz'] $foo->$bar['baz'] // interpreted as ($foo->$bar)['baz'] $foo->$bar['baz']() // interpreted as ($foo->$bar)['baz']() Foo::$bar['baz']() // interpreted as (Foo::$bar)['baz']() 理解就好,而且一般也不这么写,看起来好费劲。 |
6 iyaozhen Mar 24, 2016 大括号改变了解释的顺序。 |
7 Sunyanzi Mar 24, 2016 在 $b 等于 c ... $b[$d] 等于 e 的情况下 ... 在旧版本的 php 中 $a->$b[$d] 的含义是从 a 对象中取得 $c [$d] 的值 ... 即 $e 的值 ... 使用变量定界符的话 $a->{$b}[$d] 的含义是从 a 对象中优先取得 $c 的值然后取 $d 位 ... 如楼上所说这种差异在 php7 里面已经不存在了 ... php7 中你这两种情况都视为有定界符 ... 假如你要获得原始的结果需要使用 $a->{$b[$d]} ... 等同于 $a->e ... 这也是最规范的写法 ... 两点建议第一是从最新版的 php 用起 ... 现在还从 5.2 年代的教程看起的话未免太过误人子弟 ... 第二是 php 里面这种小坑其实还挺多的 ... 这类知识点除了面试时候有用实际开发中很难遇到 ... 所以学的时候觉得头疼也不用太过担心 ... 这不是个常见情况 ... 能记则记不能记也没关系的 ... |
8 gamexg OP |
9 gamexg OP |
10 cxbig Mar 24, 2016 输出 B 是因为 Array 的 index 从 0 开始, 1 当然是输出第二个。 |
12 MrZephyrus Mar 25, 2016 via iPhone @cxbig 233 你理解错楼主意思了 |
13 gamexg OP @jhdxr 非常感谢, Example #1 Variable property example 的地址是: http://php.net/manual/zh/language.variables.variable.php http://php.net/manual/en/language.variables.variable.php |
14 likezun Mar 25, 2016 为什么要简单的问题,搞这么复杂! 我觉得编程就应避繁从简,回避这种容易产生歧义用法 |
15 cxbig Mar 25, 2016 |
16 bombless Mar 25, 2016 via Android php 里面不是传统的解析 ast 的那种思路, 233 。它的语法设计思路在某种意义上跟 Ruby 的语意设计思路有点像 |
17 luffyfly Mar 25, 2016 理解这个完全是浪费时间,我写了五六年 php ,也理解不了。。。 |
18 wudanyang Mar 25, 2016 这个是链式结构,我问过这个问题,楼主看一下这个->https://segmentfault.com/q/1010000004486442 |
20 leitwolf Mar 25, 2016 怎么感觉是要去考试一样?计算机语言用的时候都是挑一种简单好理解就行了,考试才会找出各种对的和错误的。。。 |