PHP动态对象属性有没有办法让它工作?

时间:2010-08-03 07:43:49

标签: 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;

3 个答案:

答案 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来电都会输出“我是酒吧”。