2012-08-07 2 views
4

작업 할 클래스를 일부 설정하려고하지만 다음을 수행하는 방법을 잘 모르겠습니다.로드 된 클래스를 현재 범위 내의 변수에 할당하십시오.

내가 작업하고있는 "foo"클래스가 있고 "loader"라는 다른 클래스의 함수를 사용하고 싶다고 가정 해 보겠습니다. 이 로더 클래스의 목적은 "foo"클래스 내에서 사용할 수있는 다양한 클래스를로드하는 것입니다.

예 :이를 위해

class foo { 
    function foo() { 
     $this->load->model(); 
    } 
} 

내가 먼저 클래스 "부하"를 시작하는 것입니다 작동합니다 :

class foo { 
    function foo() { 
     $this->load = new loader; 
     $this->load->model('some_model'); 
    } 
} 

지금 내가 로더 클래스 내에서 기능을 사용할 수 있습니다. 다음으로 내가 원하는 것은로드 된 모델이 클래스 foo 내에서 액세스 할 수 있도록하는 것입니다. 예 : 나는이 지워지 어디는 "foo는"클래스의 범위 내에서 유지하는 방법을 잘 모르겠어요 때문에

class foo { 
    function foo() { 
     $this->load = new loader; 
     $this->load->model('some_model'); 
     $this->some_model->function_from_this_model(); 
    } 
} 

는 그리고 이것은이다. 언제든지 $this->load->model('some_model')을 사용하여 $this->some_model을 통해 액세스 할 수있는 새 모델을로드하고 싶습니다. 또는 $this->load->something_else('some_name')$this->some_name을 통해 제공됩니다.

여기 로더 클래스 예제 :

class loader { 
    function model($model_name) { 
     require('models/'.$model_name.'.php'); 
     $model = new $model_name; 
     // and what to do now, to get it back to the $this var from class foo? 
    } 
} 

그러나이 모든 것은 단지 로더 클래스의 범위 내에서 발생합니다.

이 작업을 수행하는 방법에 대한 아이디어가 있으십니까?

편집 :
은 내가 = $this->load->model('model_name')$this->model_name 같은 변수에 직접 할당 할 수 있습니다 알고 있지만, 내가 피하기 위해 노력하고있어입니다. 이 "로드"하위 클래스를 사용하여 클래스 "foo"의 범위 내에서 작업 할 수 있기를 바랍니다.

답변

2

다른 클래스의 클래스 개체를 초기화 할 수있는 싱글 톤을 사용할 수 있습니다.

예 :

// Loader will access class singleton and set object 
class loader { 
    function model($model_name, $class) { 
     require('models/'.$model_name.'.php'); 
     $class::init()->$model_name = new $model_name; 
    } 
} 

// see new singleton methods 
class foo { 

    private static $instance 
    public static function init(){ 
     if(is_null(self::$instance)){ 
      $class = __CLASS__; 
      self::$instance = new $class; 
     } 

     return self::$instance; 
    } 

    function foo() { 
     $this->load = new loader; 
     $this->some_model = $this->load->model('some_model', __CLASS__); 
     $this->some_model->function_from_this_model(); 
    } 
} 

// init class like this 
foo::init()->foo(); 
1

확인을 편집 여기에 내가 제안 아래에 따라, 클래스를 변경 할 방법입니다 후 :

로더는 시작 한 모델 return 필요 :

class loader { 
    function static load_model($model_name, $object) { 
     require('models/'.$model_name.'.php'); 
     $class = new $model_name; 
     $object->$model_name = $class; 
     return $object; 
    } 
} 

을 그리고 지금 당신이 사용할 수있는 :

class foo { 

    public function foo($model) 
    { 
     return loader::load_model($model, $this); 
    } 
} 

$class = new foo(); 
$class->foo('some_model'); 
1

나는 조성 관점에서 당신이 방법을 통해 푸 클래스 로더 클래스를 부착 더 좋을 것이라고 생각합니다. 따라서 다른 클래스를 사용할 수 있도록 각 클래스 내에 포함시키지 않고 클래스에 로더/모델 등을 첨부하면됩니다.이 같은 뭔가 :

class foo { 
    protected $loader = NULL; 
    protected $model = NULL; 

    public function __construct() { 

    } 

    public function attach_loader(loader $loader) { 
     $this->loader = $loader; 
    } 

    public function load_model(model $model) { 
     $this->model = $this->loader->load($model); 
    } 
} 

이 당신에게 클래스에 load() 메서드를 지원하는 어떤 로더를 장착 할 수있는 능력 (또는 로더의 자손을 허용하고 클래스로 어떤 모델 (또는 하위)를로드하는 데 사용 클래스 자체는이 클래스 파일의 위치를 ​​알 필요가 없습니다. 작동중인 항목이 특정 유형이어야합니다.

관련 문제