2010-08-03 132 views
0

所以我知道我可以做这样的事情在PHP中: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; 

回答

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}; 
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 - > {$ property_name}。

另外还有一种神奇的方法__get,您可以使用它来处理甚至不存在的属性。

+0

+1对于__get魔术方法的建议 – 2010-08-03 08:05:26

+0

您理论上也可以使用反射API http://php.net/reflection,尽管它会非常冗长,我不希望性能会很好。具体来说,你需要'$ o = new ReflectionObject($$ classname); echo $ o-> getProperty($ varname);' – 2010-08-03 08:21:23

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 - > $ 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调用将输出 “我吧”。

相关问题