6

I have a class with a private member "description" but that proposes a setter :

class Foo {
  private $description;

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

I have the name of the member in a variable. I would like to access the field dynamically. If the field was simply public I could do :

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

but I don't know how to do in the case I have only a setter.

1

4 Answers 4

11
<?php
$bar = "description";
$f = new Foo();
$func="set"+ucwords($bar);
$f->$func("asdf");
?>
Sign up to request clarification or add additional context in comments.

1 Comment

Thank you very much. It was actually straightforward but I didn't dare do that (I am used to C++) :)
4

Try this:

$bar = 'description';
$f = new Foo();
$f->{'set'.ucwords($bar)}('test');

Comments

1

This function come do the job:

  private function bindEntityValues(Product $entity, array $data) {
      foreach ($data as $key => $value){
        $funcName = 'set'+ucwords($key);
        if(method_exists($entity, $funcName)) $entity->$funcName($value);
      }
    }

Comments

0

Use magic setter

class Foo {
  private $description;

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

but by this way your all private properties will act as public ones if you want it for just description use this

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; 
      }*/
    }

2 Comments

Ok, but why not put them public then ? sorry it might be a newbie question.
@Barth not so fancy as you think :)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.