2012-08-07 62 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'); 
    } 
} 

現在我可以使用的功能從Loader類中。接下來我想要的是從foo類中訪問已加載的模型。例如:

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

這就是我迷路的地方,因爲我不確定如何保持在「foo」類的範圍內。在任何時候,我希望能夠使用$this->load->model('some_model')加載一個新模型,通過$this->some_model可以訪問。或者通過$this->some_name變得可用的$this->load->something_else('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->model_name = $this->load->model('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

我認爲,從組合的觀點來說,你會通過你的方法的類裝載器連接到Foo類的更好。因此,不必在每個類中都包含使其他類可用的內容,而只需將加載器/模型等附加到類中。因此,像這樣:

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()方法的類的能力(或裝載機的後裔,並利用它的任何模型(或後裔)加載到你的類。這個類本身並不需要知道這些類文件的位置,只是它們正在操作的項目必須是某種類型的。