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 中访问加载的模型。例子:

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->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->model_name= $this->load->model('model_name'),但这就是我想要避免的。我希望能够使用这个“加载”子类能够在“foo”类的范围内工作。

4

3 回答 3

2

您可以使用 Singleton,它允许您从另一个类初始化您的类对象。

例子:

// 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();
于 2012-08-07T16:16:07.200 回答
1

好的,在您编辑后,我建议您更改您的课程,如下所示:

您的加载程序需要返回您启动的模型:

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');
于 2012-08-07T16:10:58.990 回答
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() 方法的加载器的后代)附加到类并利用它将任何模型(或后代)加载到您的类中。类本身不需要知道这些类文件的位置,只是它们正在操作的项目必须是某种类型。

于 2012-08-07T16:18:12.100 回答