2013-05-06 94 views
19

我曾经遇到过需要访问/修改变量这样:

$this->{$var} 

的背景是与CI DataMapper的获取规则。我似乎无法找到这个语法实际上做了什么。 {在这方面做什么?为什么不只是:

$this->var 

谢谢!

回答

36

这是一个变量变量,这样你将以$this->{value-of-$val}结束。

请参见:http://php.net/manual/en/language.variables.variable.php

因此,例如:

$this->a = "hello"; 
$this->b = "hi"; 
$this->val = "howdy"; 

$val = "a"; 
echo $this->{$val}; // outputs "hello" 

$val = "b"; 
echo $this->{$val}; // outputs "hi" 

echo $this->val; // outputs "howdy" 

echo $this->{"val"}; // also outputs "howdy" 

工作例如:http://3v4l.org/QNds9

当然,这是一类环境中工作。你可以在当地的环境很容易地使用可变的变量是这样的:

$a = "hello"; 
$b = "hi"; 

$val = "a"; 
echo $$val; // outputs "hello" 

$val = "b"; 
echo $$val; // outputs "hi" 

工作例如:http://3v4l.org/n16sk

+6

hmm'$ object-> attr' ='$ object - > {“attr”}':) – 2013-05-06 22:08:13

+0

@DaveChen用这个例子更新了我的答案 – jszobody 2013-05-06 22:22:24

+2

我记得我刚开始的时候, $ this - > $ val'并失败了。很高兴看到这个答案。 – 2013-05-06 22:24:14

8

的所有$this->{$var}$this->var是两个完全不同的事情首先。后者将请求var类变量,而另一个将请求包含在$var字符串中的变量的名称。如果$var是字符串'foo'那么它将请求$this->foo等。

这对于动态编程(只有在运行时才知道变量的名称)很有用。

${'y - x'} = 'Ok'; 
$var = 'y - x'; 
echo ${$var}; 

将打印Ok即使变量名y - x是因为空间和-字符无效:但是,尤其是当你有奇怪的变量名的经典{}符号在字符串上下文中是非常强大的。

+1

+1!我从来不知道变量名称可能很复杂。那么,你可以把一个数组/对象作为变量名吗? – 2013-05-07 01:21:23

+1

@DaveChen,他们的字符串表示是。虽然我认为变量名称有一个长度限制。我认为这不是一种好的做法,因此我会避免它。 – Shoe 2013-05-07 03:11:24

相关问题