我正在尝试设置一些可以使用的类,但我不确定如何完成以下操作。
假设我有一个我正在使用的类“foo”,我想使用另一个名为“loader”的类中的函数。这个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->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?
}
}
但所有这些只发生在loader类的范围内。
关于如何实现这一目标的任何想法?
修改:
我知道我可以将它直接分配给变量,例如$this->model_name
= $this->load->model('model_name')
,但这正是我想要避免的。我希望能够使用这个“load”子类,以便能够在“foo”类的范围内工作。
答案 0 :(得分: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();
答案 1 :(得分: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');
答案 2 :(得分: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()方法的加载器的后代附加到类中,并利用它将任何模型(或后代)加载到类中。类本身不需要知道这些类文件的位置,只是它们正在操作的项必须是某种类型。