4

首先,我知道

  • 不要重新发明轮子
  • MVC 有很多框架。

这不是为了制作工作,而是为了我的爱好项目。我从头开始编写 MVC 是为了更深入地了解 MVC,并让我自己满意。最后,我可以对自己说:“哥们,你做到了。你自己写了一个MVC框架!


我现在的问题。通常,我们会在 MVC 中编写一些类,并且从一开始就在那里。我们通常称它们为 , Bootstrapper, Router,RegistryConfig。可能还有更多,但我现在想专注于这些。通常,每个请求我们不需要这些类的多个实例(单例?)。我认为从名称本身就很清楚这些类的作用。所以现在我的问题:

谁先开始(我认为是Bootstrapper)?这些类是如何联系在一起的?他们都需要单身吗?我们如何使这些(Bootstrapper可能是例外)的实例可用于应用程序中的其他类(也许我们使用单例)?

4

2 回答 2

7

由于我现在正在做同样的事情,所以这是我的观点:

  • 不要使用魔法BootstrapperCoreInitializer。最好将该功能放在一个bootstrap.phpinit.php文件之类的东西中。在我的项目中,这样的文件包含其他类之间的所有“连接”(Router创建的实例,注入不同的工厂等等)。

  • 不要在您的应用程序中使用全局状态(Register并且Config最有可能引入全局状态)。我建议您观看此讲座播放列表以获得一些见解。

  • 如果答案是“单身”,你问错了问题

  • 应用程序从哪里开始,取决于您如何创建代码,但不应从类内部踢出它。想想可能需要了解您的框架如何工作的其他人(包括您,6 个月后)。挖着想换个班,光是去魔法init()功能就很烦了。

  • 了解什么是SOLID 原则得墨忒耳法则

..我的两分钱

于 2012-05-31T11:48:56.577 回答
1

您的问题与 MVC 关系不大,更多与使用全局变量或全局值有关。

许多此类,通常每个类需要一个实例(“单例”),并且在某些情况下,无法避免单例,在您的情况下,可以拥有它们。

许多书籍,教程没有教什么,它应该如何在何时何地初始化单例。它从编程语言变为编程语言。

而且,在网站的情况下,变量在更改到另一个页面时会丢失它们的值,这变得很复杂。

有一个称为“会话变量”的概念,它与单例一起工作,允许在从一页切换到另一页时保留值:

http://php.net/manual/en/session.examples.basic.php

假设您有一个网站。它有几个文件和几个页面。其中一些 php 文件被直接调用并被视为“网页”,例如“index.php”。

其他 php 文件,是库文件,被其他文件“必需”或“包含”,它们本身不被视为“网页”。

当用户单击 wbe 页面中的链接,并且浏览器调用另一个网页时,所有这些值都可能丢失。它不像在桌面应用程序中打开另一个表单。

想想,当用户第一次进入网站时(例如:“index.php”):主文件“包含”或“需要”其他文件,并初始化全局变量或单例:

<?php
// filename: "config.php"

// another includes or requires here

class Config
{
   // begin data section
   public static $UserName;  
   public static $UserPassword;  
   // end data section

   // begin singleton section
   private static $_instance;

   public static function getInstance()
   {
      if (!self::$_instance instanceof self)
      {
         self::$_instance = new self;
      }
      return self::$_instance;
   }
   // end singleton section

   // start session section
   public static function SaveSession()
   {
     $_SESSION['config_username'] =  Config::$UserName;
     $_SESSION['config_password'] =  Config::$UserPassword;
   }   

   public static function RestoreSession()
   {
     Config::$UserName = $_SESSION['config_username'];
     Config::$UserPassword = $_SESSION['config_password'];
   }   
   // end session section

} // class Config

?>    

<?php
// filename: "index.php"

include ("config.php");
// another includes or requires here

class Application
{
   public static function main()
   {
      // prepare session variables
      session_start();

      // prepare singletons here
      $instance = Config::getInstance();

      // this code its an example
      $instance->UserName = "johndoe";
      $instance->UserPassword = "123";
      $instance->SaveSession();

      // all the page construction goes here
      // ...
   }
} //

// program starts here:
Application::main();

?>

当用户更改到另一个页面时,应用程序必须将会话数据重新加载到单例中。

<?php
// filename: "customers.php"

include ("config.php");
// another includes or requires here

class Application
{
   public static function main()
   {
      // copy data from session to singletons
      $instance->RestoreSession();

      // all the page construction goes here
      // ...
   }
} //

// program starts here:
Application::main();

?>

单例之间没有关系,通常它们是独立的值。

干杯。

于 2012-05-31T15:56:17.920 回答