2012-12-11 10 views
-1

클래스 'base'와 클래스 'loader'가 있습니다. __get 및 __set 마법 메서드에 액세스 할 수 없습니다.

class base { 

    protected $attributes = Array(); 
    public $load = null;   

    function __construct() { 

     $this->load = loader::getInstance(); 
     echo $this->load->welcome(); //prints Welcome foo 
     echo $this->load->name; //prints Foo 
     echo $this->name; //doesnt print anything and i want it to print Foo 

    } 


    public function __get($key) { 

     return array_key_exists($key, $this->attributes) ? $this->attributes[$key] : null; 
    } 

    public function __set($key, $value) { 

     $this->attributes[$key] = $value; 
    } 
} 

class loader { 

    private static $m_pInstance;  

    private function __construct() { 

     $this->name = "Foo"; 

    } 

    public static function getInstance() { 
     if (!self::$m_pInstance) { 
      self::$m_pInstance = new loader(); 
     } 

     return self::$m_pInstance; 
    } 

    function welcome() { 
     return "welcome Foo"; 
    } 

} 

$b = new base(); 

지금 내가 원하는 로더 클래스의 변수를 저장하고 $this->variablename를 사용하여 기본 클래스에서 액세스 할 수있는 방법이다.

어떻게하면됩니까? extends을 사용하고 싶지 않습니다. 어떤 생각?

+0

'loader' 클래스 인스턴스는'base'의 생성자를 통해 전달되어야합니다. –

+0

나는 이것을 전달하고 기본 클래스 변수 'load'에 $ this-> load = loader :: getInstance();를 사용하여 로더 클래스 인스턴스를 저장하고있다. –

+1

그건 다르지 않습니다. 생성자를 통해 전달하는 것이 더 깔끔합니다. –

답변

1

귀하의 __get/__ set 메소드처럼 액세스 할 수있는 것은 $this->attributes하지만 $this->load에 액세스 할 수 있습니다.
예 : 완전히 OOP의 방법이 무엇을 의미하는지 코딩 이해할 것 같은 http://docs.php.net/property_exists

+0

Thanks @VolkerK. 그게 정확히 내가 찾고 있던거야. +1 –

0

당신은 정적 변수를 만들 수 있습니다 다음은 어디

public statis $var = NULL; 

에서이 변수를 액세스 할 수 있으며이

classname::$var; 
+0

그건 OOP 방식이 아니에요 ... – Shoe

2

내가 느끼지 않는다 :

function __get($key) { 
    - if $attribute has an element $key->$value return $attribute[$key] else 
    - if $load is an object having a property $key return $load->$key else 
    - return null; 
} 

도 참조 (의사) 그런 짓을. 그리고 대개 싱글 톤은 코드 냄새이므로 경고 할 것입니다.

목표를 달성하는 데 더 좋은 방법이있을 것입니다. 더 많은 정보를 제공해 주시면 도와 드리겠습니다. 현재의 형태에서 답은 다음과 같습니다. 그냥 귀하의 코드에서 higly 낙심 그를 기억하십시오.

$this->attributes = get_object_vars(loader::getInstance()); 

이를 :

방금 ​​기본 클래스 생성자의 시작 부분에이 줄을 삽입해야 base 클래스에 this->varname으로 loader의 변수 만 공개 (비 정적)에 액세스하려는 가정 기본적으로 모든 로더 공용 변수를 사용하여 특성 배열을 초기화하므로 __get() 메서드를 통해 해당 값에 액세스 할 수 있습니다.

싱글 톤을 사용하지 않으려면 Dependency Injection design pattern을 보시기 바랍니다.

+0

이것에 대한 확장으로서,이 경우에는 "Base"에 필요한 "loader"의 정확한 변수를 전달해야합니다. 이러한 일반적인 이름은 코드 냄새를 암시합니다. –