Hello @kartik,
You access the property in the wrong way. With the $this->$my_value = .. syntax, you set the property with the name of the value in $my_value. What you want is $this->my_value = ..
$var = "my_value";
$this->$var = "test";
is the same as
$this->my_value = "test";
To fix a few things from your example, the code below is a better aproach
class my_class {
    public  $my_value = array();
    function __construct ($value) {
        $this->my_value[] = $value;
    }
    function set_value ($value) {
        if (!is_array($value)) {
            throw new Exception("Illegal argument");
        }
        $this->my_value = $value;
    }
    function add_value($value) {
        $this->my_value = $value;
    }
}
$a = new my_class ('a');
$a->my_value[] = 'b';
$a->add_value('c');
$a->set_value(array('d'));
This ensures, that my_value won't change it's type to string or something else when you call set_value. But you can still set the value of my_value direct, because it's public. The final step is, to make my_value private and only access my_value over getter/setter methods