Magic Method __set() on a Instantiated Object
- by streetparade
Ok i have a problem, sorry if i cant explaint it clear but the code speaks for its self.
i have a class which generates objects from a given class name;
Say we say the class is Modules:
public function name($name)
{
   $this->includeModule($name);
   try
   {
       $module    = new ReflectionClass($name);
     $instance = $module->isInstantiable() ? $module->newInstance() : "Err";
      $this->addDelegate($instance);
   }
   catch(Exception $e)
   {
      Modules::Name("Logger")->log($e->getMessage());
   }
   return $this;
 }
The AddDelegate Method:
protected function addDelegate($delegate)
{
    $this->aDelegates[] = $delegate;
}
The __call Method
public function __call($methodName, $parameters)
{
   $delegated = false;
   foreach ($this->aDelegates as $delegate)
   {
          if(class_exists(get_class($delegate)))
          {
         if(method_exists($delegate,$methodName))
         {
        $method     = new ReflectionMethod(get_class($delegate), $methodName);
        $function   = array($delegate, $methodName);
       return  call_user_func_array($function, $parameters);
          }
     }
   }
The __get Method
public function __get($property)
    {
        foreach($this->aDelegates as $delegate)
        {
            if ($delegate->$property !== false)
            {
                return $delegate->$property;
            }
        }
    }
All this works fine expect the function __set 
public function __set($property,$value)
    {
        //print_r($this->aDelegates);
        foreach($this->aDelegates as $k=>$delegate)
        {
            //print_r($k);
            //print_r($delegate);
            if (property_exists($delegate, $property))
            {
                $delegate->$property = $value;
            }
        }
        //$this->addDelegate($delegate);
        print_r($this->aDelegates);
    }
class tester
{
  public function __set($name,$value)
    {
        self::$module->name(self::$name)->__set($name,$value);
    }
}
Module::test("logger")->log("test"); //  this logs,  it works
echo Module::test("logger")->path; //prints /home/bla/test/ this is also correct
But  i cant set any value to class log like this
Module::tester("logger")->path ="/home/bla/test/log/";
The path property of class logger is public so its not a problem of protected or private property access.
How can i solve this issue? I hope i could explain my problem clear.