是否可以按名称设置类属性?

时间:2011-12-14 14:36:52

标签: php

这里的简单问题......我想知道是否可以通过它的名称以任何方式访问类属性。

想象一下这种情况:

$array = array(
    'foo' => 'bar',
    'hello' => 'world',
    'chuck' => 'norris'
);

然后有这个课程:

class MegaClass {
    public $foo, $hello, $chuck;
}

我想知道我是否可以自动将MegaClass::foo设置为barMegaClass::hello设置为world等等。因此,给定数组,并给定对象,对象被填充。当从具有填充属性的表单中检索数据时,这可能非常方便......

6 个答案:

答案 0 :(得分:2)

如果你想做MegaClass::foo,那么他们必须是静态的。

如果它们是静态的,你可以这样做:

foreach($array as $key=>$val){
    MegaClass::$key = $val;
}

如果他们不是静态的(但仍然是公开的):

foreach($array as $key=>$val){
    $MegaClassObject->$key = $val;
}

答案 1 :(得分:1)

对于非静态成员,那么

$mc = new MegaClass();
foreach($array as $k=>$v) $mc->$k = $v;

应该这样做。如果这就是你要求的。

对于静态,您可以指定为

MegaClass::${$k} = $v;

但仅限于声明静态属性。

答案 2 :(得分:1)

这样的事情,至少可以做你要求的事情:

public function setProperties($array) {
  foreach($array as $key => $value) {
    $this->$key = $value;
  }
}

我会考虑稍微清除它,可能是通过检查属性是否存在以及它尚未设置。当然,您可以根据您的特定要求对其进行修改。

public function setProperties($array) {
  foreach($array as $key => $value) {
    if (property_exists(get_called_class(), $key)) {
      if ($this->$key === NULL) {
        $this->$key = $value;
      }
    }
  }
}

答案 3 :(得分:1)

你可以通过一个简单的公共功能和你班上的foreach来做到这一点。

class MegaClass {
  public function setarray(array $array){
    foreach($array as $key = > $value){
       $this->$key = $value;
    }
  }
}

$array = array(
    'foo' => 'bar',
    'hello' => 'world',
    'chuck' => 'norris'
);

$megaclass = new MegaClass();
$megaclass->setarray($array); // this wil set the array to the vars

echo $megaclass->foo; // this will output bar

foreach将$ array设置为2个其他变量,即$ key和$ value。在$ key中,foo,hello和chuck以及$ value代表吧,世界和诺里斯。

foreach循环逐个循环每个东西并将其设置为正确的数组。

php foreach menual

答案 4 :(得分:0)

不是100%肯定我理解你的问题,但假设你的属性不是静态的,你需要一个实例:

$m = new MegaClass();
echo $m->foo;

但是拥有一堆公共字段并通过循环遍历某个数组来设置它们可能不是最好的设计。为什么不将数组传递给MegaClass的构造函数,并让它在内部初始化它的字段?或者,使用静态工厂方法从该数组创建新实例。

答案 5 :(得分:0)

如果我理解你的问题......

$mc = new MegaClass()
foreach( $array as $key=>$value ) {
    $mc->$key = $value;
}