在PHP中将对象添加到实例

时间:2011-03-09 21:00:35

标签: php oop object singleton

简介

我正在开发一个MVC框架,但我遇到了一个问题。看起来我想要完成的东西被称为Singleton Design方法 - 只初始化类一次。请记住,我正试图尽可能减少控制器“acontroller”中的代码。

话虽如此,最后一个问题仍然存在:如何将对象添加到已经实例化的对象中?

拥有或至少看到实际的源代码而不仅仅是示例源代码可能会有所帮助,所以我将源代码推送到了我的github。你可以在这里找到:https://github.com/derekmaciel/uMVC


代码说明

“引擎盖下”发生的事情首先是

  • Controller类加载位于/ application / controller中的控制器,在本例中为“acontroller”。
  • 之后,acontroller类使用Load类加载模型(称为“amodel”),使用$ this-> load-> model(“amodel”),它在Controller __construct中实例化。
  • $ this-> load-> model(“amodel”)的最终结果是:$ controller-> amodel =&新的Amodel(),其中$ controller是Controller实例(不是acontroller,因为加载模型的控制器会有所不同)。
  • 步骤4:允许acontroller访问已加载的模型(amodel)。

代码结果

可在此处找到这些脚本当前输出的副本:http://pastebin.com/EJxuXaki

你会注意到的第一件事是我被警告使用不推荐的作业。我现在要专注于错误。

你会注意到的第二件事是我首先打印了控制器实例的print_r()。里面有一个amodel对象,想要添加到acontroller。

之后,我print_r()'$ this(acontroller)对象。它拥有从__construct()获得的所有东西,但不是amodel。

如果我可以让acontroller“看到”amodel,那么我的问题就会解决。

此外: 反正我是否从控制器控制器中删除“parent :: init()”?我只是这样做,所以acontroller可以访问Load和Model类,但我试图在acontroller中尽可能减少代码,因此让acontroller自动访问Load和Model会有很大帮助。

我希望我很清楚。谢谢你的帮助

3 个答案:

答案 0 :(得分:2)

我个人认为单例方法不属于MVC框架,原因是因为加载的主要对象是模型,库和控制器,其他所有内容(如路由器)通常都是硬编码的。

我要做的结构是创建以下类:

  • ModelLoader
  • LibraryLoader

并在系统启动期间包含它们,然后在主控制器中执行以下操作:

class Controller
{
    public $library;
    public $model;

    public function __construct()
    {
        $this->library = new LibraryLoader();
        $this->model = new ModelLoader();
    }
}

这会将2个加载器暴露给子控制器,你的模型/库应该包含一个存储加载对象的私有数组,如下所示:

class LibraryLoader extends ObjectLoader
{
     protected $_path = "/app/library/";
     protected $_ext = '.php';
}

class ModelLoader extends ObjectLoader
{
     protected $_path = "/app/models/";
     protected $_ext = '.php';
}

对象加载器看起来像这样:

class ObjectLoader
{
     protected $_path = "/app/";
     protected $_ext = '.php';

     public function __get($item)
     {
          /*
                * Load item here, the paths above would be overwritten
                * store the object in an array, make sure you check if its already loaded
           */
     }
}

这是非常基本的,但在您的子控制器(如索引/家庭等)中,您可以执行以下操作:

class indexController extends Controller
{
    public function index()
    {
        $this->model->users->getUser(22);
        $this->library->security->validateInput("get","key");

        //As the objectLoader manages whats loaded, any further calls to the above would
        //use the same objects initiated as above.
    }
}

这应该让你开始,它使用单例方法更加简化它们。

答案 1 :(得分:0)

我想你需要在controller.php中包含Model.php才能使用模型类。

include 'Model.php';
include 'Load.php';

答案 2 :(得分:0)

从PHP 5.3开始,您可以使用static关键字来实例化一个类

abstract class singleton
{
    /**
     * Holds an insance of self
     * @var $instance
     */
    protected static $instance = NULL;

    /**
     * Prevent direct object creation
     */
    final private function  __construct() { }

    /**
     * Prevent object cloning
     */
    final private function  __clone() { }

    final public static function getInstance()
    {
        if(null !== static::$instance){
            return static::$instance;
        }
        static::$instance = new static();
        return static::$instance;
    }
}

class myclass extends singleton
{
}

$myclass = myclass::getInstance();