变量 + 字段中的对象

variable variables + objects in fields

提问人:Santhos 提问时间:4/19/2012 最后编辑:Santhos 更新时间:4/19/2012 访问量:143

问:

我正在尝试用变量做一些事情,但我遇到了一个对象问题。想象一下这样的课程设置:

class A
{
  public $field = 10;
}

class B
{
  public $a;

  public function __construct()
  {
    $this->a = new A();
  }
}

现在每个人都知道这组代码是有效的:

$a = new A();
$var = 'field';
echo $a->$var; // this will echo 10

我有没有可能做这样的事情?

$b = new B();
$var = 'a->field';
echo $b->$var; // this fails

注意:任何不使用 eval 函数的选项?

php oop 变量

评论

1赞 Travesty3 4/19/2012
你是说吗?echo $b->$var
0赞 Santhos 4/19/2012
是的,我做到了,现在应该修复
0赞 Leven 4/19/2012
没错,但我认为这行不通。
0赞 Santhos 4/19/2012
好吧,它不起作用:)这就是问题所在,如何让它发挥作用......如何编写代码,以便在可能的情况下进行类似的事情

答:

0赞 Leven 4/19/2012 #1

我不推荐它,但您可以使用 eval:

$b = new B();
$var = 'a->field';
eval( 'echo $b->$'.$var );
2赞 Dmytro Shevchenko 4/19/2012 #2

使用闭合怎么样?

$getAField = function($b) {
    return $b->a->field;
};

$b = new B();
echo $getAField($b);

不过,这只有在较新版本的 PHP 中才有可能。

或者,作为更通用的版本,如下所示:

function getInnerField($b, $path) { // $path is an array representing chain of member names
    foreach($path as $v)
        $b = $b->$v;
    return $b;
}

$b = new B();
echo getInnerField($b, array("a", "field"));
0赞 Leven 4/19/2012 #3

我想这也应该有效:

$b = new B();
$var1 = 'a'; 
$var2 = 'field'

echo ($b->$var1)->$var2; 
1赞 Benjamin Schulte 4/19/2012 #4

可以在类上编写自定义__get方法来访问 childrens 属性。这有效:

class A
{
  public $field = 10;
}

class B
{
  public $a;

  public function __construct()
  {
    $this->a = new A();
  }

  public function __get($property) {
    $scope = $this;

    foreach (explode('->', $property) as $child) {
      if (isset($scope->$child)) {
    $scope = $scope->$child;
      } else {
    throw new Exception('Property ' . $property . ' is not a property of this object');
      }
    }

    return $scope;
  }
}

$b = new B();
$var = 'a->field';
echo $b->$var;

希望能有所帮助