2010-04-14 4 views
2

그래, 문제가 생겼어. 미안해. 분명히 설명 할 수는 없지만 코드는 스스로를 말해 준다.인스턴스화 된 객체에서 매직 메소드 __set()

주어진 클래스 이름에서 개체를 생성하는 클래스가 있습니다.

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/"; 

같은 수준의 로그 값을 설정 질수 있으므로 보호 또는 개인 재산이 아니 문제 접속하다.

어떻게이 문제를 해결할 수 있습니까? 나는 나의 문제를 분명히 설명 할 수 있었으면 좋겠다.

편집 : 간단한 데모

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 
+0

문제를 보여주는 간단한 독립 스크립트 (예 : 복사 및 붙여 넣기 가능) 스크립트를 제공 할 수 있습니까? – VolkerK

+0

@VolkerK 여기 – streetparade

+0

위의 예에서 보면도 print_r의 배열 이다있다 ( [0] => XML_Helper 개체 ( [xmlVersion] => 안녕 ) ) 정확한 보이지만 어디에 오류가 ? – streetparade

답변

1

나는 당신이 이미 경로가 공공 말했다 실현,하지만 여전히 언급 할 가치가있다 : 당신이 PHP 5.3.0+를 사용하는 경우, property_exists()의 특질주의 :

5.3.0 | 당신이 if (property_exists($delegate, $property))을 선택하면이 기능은 다른 말로 접근성

의 독립적 인 속성의 존재를 확인, 당신은 당신이 그 문제에 관해서, 쓰기 (또는 읽기 $delegate->$property에 액세스 할 수있는 보장이 없다, 그러나 당신은 있습니다).

실제 문제 해결 방법 : if (property_exists($delegate, $property)) 문이 실제로 실행되는지 확인할 수 있습니다. 그렇지 않은 경우 case$property인지 확인하십시오.

Sidenote : 게시 한 코드를 읽는 것이 상당히 어렵 기 때문에 문제를 해결하는 데 약간의 어려움이 있습니다. 게시물을 편집하고 들여 쓰기를 제대로 할 수 있었습니까?

1

의 그것없는 문제가 보호 또는 개인 속성 액세스 있도록 클래스 로거의 경로 속성 공개 .

문제가 있습니다. the docs에서 : __set() 공공 속성에 대해 호출되지 것을 제안

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

.

관련 문제