Магический метод __set () на созданном объекте - PullRequest
2 голосов
/ 15 апреля 2010

Хорошо, у меня проблема, извините, если я не могу объяснить это ясно, но код говорит сам за себя.

у меня есть класс, который генерирует объекты с заданным именем класса; Скажем, мы говорим, что класс Модули:

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

Метод AddDelegate:

protected function addDelegate($delegate)
{
    $this->aDelegates[] = $delegate;
}

Метод __call

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);
          }
     }

   }

Метод __get

public function __get($property)
    {
        foreach($this->aDelegates as $delegate)
        {
            if ($delegate->$property !== false)
            {
                return $delegate->$property;
            }

        }


    }

Все это прекрасно работает, ожидайте, что функция __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

Но я не могу установить любое значение для журнала классов, как это

Module::tester("logger")->path ="/home/bla/test/log/";

Свойство path класса logger является открытым, поэтому оно не является проблемой защищенного или частного доступа к свойству.

Как я могу решить эту проблему? Я надеюсь, что смогу объяснить свою проблему ясно.

EDIT: Простая демонстрация

Modules::Name("XML_Helper")->xmlVersion ="Hello"; // default is 333
$a =  Modules::Name("XML_Helper")->xmlVersion; // now $a should contain "Hello" 
echo $a; // prints 333

Что мне нужно, это

Modules::Name("XML_Helper")->xmlVersion ="Hello"; // default is 333
$a =  Modules::Name("XML_Helper")->xmlVersion; // now $a should contain "Hello" 
echo $a; // prints Hello

Ответы [ 2 ]

1 голос
/ 23 апреля 2010

Я понимаю, что вы уже сказали, что путь публичный , но все же стоит упомянуть: если вы используете PHP 5.3.0+, обратите внимание на эту причуду property_exists():

5.3.0 | Эта функция проверяет существование свойства независимо от доступность

Другими словами, если вы отметите if (property_exists($delegate, $property)), у вас нет гарантии, что у вас есть доступ к $delegate->$property для записи (или чтения, если на то пошло, но вы пытаетесь писать).

Что касается фактического устранения неполадок: вы можете попробовать проверить, действительно ли выполняется оператор if (property_exists($delegate, $property)). Если это не так, проверьте кейс из $property.

Sidenote: Довольно сложно прочитать код, который вы выложили, что затрудняет поиск и устранение неисправностей. Не могли бы вы отредактировать свое сообщение и правильно сделать отступ?

1 голос
/ 15 апреля 2010

Свойство path класса logger является общедоступным, поэтому его не проблема охраняемый или частный доступ к собственности.

Это твоя проблема. От документов :

__set() is run when writing data to inaccessible properties.

Это говорит о том, что __set() не вызывается для открытых свойств.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...