6

我有一个带有私有成员“描述”的类,但它提出了一个 setter:

class Foo {
  private $description;

  public function setDescription($description) { 
    $this->description = $description; 
  }
}

我在变量中有成员的名称。我想动态访问该字段。如果该领域只是公开的,我可以这样做:

$bar = "description";
$f = new Foo();
$f->$bar = "asdf";

但如果我只有一个二传手,我不知道该怎么做。

4

4 回答 4

10
<?php
$bar = "description";
$f = new Foo();
$func="set"+ucwords($bar);
$f->$func("asdf");
?>
于 2012-07-23T12:42:15.167 回答
4

试试这个:

$bar = 'description';
$f = new Foo();
$f->{'set'.ucwords($bar)}('test');
于 2012-07-23T12:44:11.717 回答
0

使用魔法二传手

class Foo {
  private $description;

  function __set($name,$value)
  {
    $this->$name = $value;
  }  
/*public function setDescription($description) { 
    $this->description = $description; 
  }*/
}

但是通过这种方式,如果您希望它仅用于描述,您的所有私有属性都将充当公共属性,请使用此

class Foo {
      private $description;

      function __set($name,$value)
      {
        if($name == 'description')
        { $this->$name = $value;
          return true;
         }
         else 
        return false
      }  
    /*public function setDescription($description) { 
        $this->description = $description; 
      }*/
    }
于 2012-07-23T12:43:20.447 回答
0

这个功能来做这项工作:

  private function bindEntityValues(Product $entity, array $data) {
      foreach ($data as $key => $value){
        $funcName = 'set'+ucwords($key);
        if(method_exists($entity, $funcName)) $entity->$funcName($value);
      }
    }
于 2018-11-06T03:08:14.047 回答