所以我知道我可以在PHP中做这样的事情:
<?php
$x = 'a';
$a = 5;
echo $$x;
将输出5;
但它不适用于对象/属性。有没有办法让这段代码有效?
<?php
class FooBar
{
public $foo;
public $bar;
public function __construct()
{
$this->foo = 'foo';
$this->bar = 'bar';
}
}
$FooBar = new FooBar();
$str = 'FooBar->foo';
echo $$str;
答案 0 :(得分:4)
class FooBar
{
public $foo;
public $bar;
public function __construct()
{
$this->foo = 'foo';
$this->bar = 'bar';
}
public function getFoo()
{
return $this->foo;
}
}
$fb = new FooBar();
$classname = "fb";
$varname = "bar";
echo call_user_func(array($fb, "getFoo")); // output "foo"
echo call_user_func(array($$classname, "getFoo")); // same here: "foo"
echo $$classname->{$varname}; // "bar"
请参阅call_user_func手册。您还可以访问以下属性:$ fb-&gt; {$ property_name}。
还有魔术方法__get,您可以使用它来处理甚至不存在的属性。
答案 1 :(得分:2)
这可能很接近:
class FooBar
{
public $foo;
public $bar;
public function __construct()
{
$this->foo = 'foo';
$this->bar = 'bar';
}
}
$FooBar = new FooBar();
$str = 'FooBar->foo';
list($class,$attribute) = explode('->',$str);
echo $$class->{$attribute};
答案 2 :(得分:1)
无法做到
$str = 'FooBar->foo'; /* or */ $str = 'FooBar::foo';
echo $$str;
因为PHP必须首先评估对象或类的操作。变量变量采用变量的值并将其视为变量的名称。 $FooBar->foo
不是名称,而是操作。你可以这样做:
$str = 'FooBar';
$prop = 'foo';
echo $$str->$prop;
来自PHP Manual on Variable Variables:
也可以使用变量属性名访问类属性。变量属性名称将在进行调用的范围内解析。例如,如果你有一个表达式,例如$ foo-&gt; $ bar,那么本地范围将被检查$ bar,它的值将被用作$ foo属性的名称。如果$ bar是数组访问权限,也是如此。
手册示例:
class foo {
var $bar = 'I am bar.';
}
$foo = new foo();
$bar = 'bar';
$baz = array('foo', 'bar', 'baz', 'quux');
echo $foo->$bar . "\n";
echo $foo->$baz[1] . "\n";
两个echo
来电都会输出“我是酒吧”。