0

可変変数を使用して何かをしようとしていますが、オブジェクトの問題で行き詰まりました。このクラスの設定を想像してください:

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 関数を使用しないオプションはありますか?

4

4 に答える 4

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"));
于 2012-04-18T19:15:10.130 に答える
1

クラスにカスタム __get メソッドを記述して、children プロパティにアクセスできます。これは機能します:

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;

それが役立つことを願っています

于 2012-04-18T19:25:22.653 に答える
0

これもうまくいくはずです:

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

echo ($b->$var1)->$var2; 
于 2012-04-18T19:23:07.300 に答える
0

お勧めしませんが、eval を使用できます。

$b = new B();
$var = 'a->field';
eval( 'echo $b->$'.$var );
于 2012-04-18T19:13:45.933 に答える