Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Model view controller MVC/HMVC与面向对象编程_Model View Controller_Oop_Codeigniter_Kohana - Fatal编程技术网

Model view controller MVC/HMVC与面向对象编程

Model view controller MVC/HMVC与面向对象编程,model-view-controller,oop,codeigniter,kohana,Model View Controller,Oop,Codeigniter,Kohana,我一直在阅读和学习面向对象编程(以及——感谢StackOverflow上的建议)。我还学习了如何使用两个PHP MVC框架(特别是和) 我所读到的一些面向对象原则在MVC框架中的处理方式有所不同。我想我已经设法理解了这些差异以及做出决定的原因(完整且易于使用的解决方案),但我想测试一下我的假设……因此,如果你能幽默我……请评论或更正 假设#1: 考虑web应用程序的正确抽象,包含类库的目录应该位于包含表示文件的目录之外。该组织遵循DRY(“不要重复自己”)原则,允许多个演示文件夹(www.dom

我一直在阅读和学习面向对象编程(以及——感谢StackOverflow上的建议)。我还学习了如何使用两个PHP MVC框架(特别是和)

我所读到的一些面向对象原则在MVC框架中的处理方式有所不同。我想我已经设法理解了这些差异以及做出决定的原因(完整且易于使用的解决方案),但我想测试一下我的假设……因此,如果你能幽默我……请评论或更正

假设#1:

考虑web应用程序的正确抽象,包含类库的目录应该位于包含表示文件的目录之外。该组织遵循DRY(“不要重复自己”)原则,允许多个演示文件夹(www.domain.com、management.domain.com、api.domain.com等)使用相同的对象

假设#2:

如果所有类都位于演示文件夹之外,那么MVC实现中的模型只使用这些类的实例。如果这是真的,那么MVC框架只是一个表示类(控制器),它帮助管理输入(GET&POST请求)、响应(模型或实例)和输出(视图或模板)

假设#3:

如果MVC框架只是一个表示类,那么控制器实例初始化的数据库类将破坏控制器类的抽象。(控制器实例的)模型不应该有(“has”)数据库,它应该有类库中的一个对象(用户、产品),而该对象应该有一个数据库

假设#4:

此外,如果MVC框架只是一个表示类,那么控制器实例初始化的数据库类与控制器类的耦合过于紧密。从一种存储方法更改为另一种存储方法需要重新分解所有模型

假设#5:

在HMVC框架中,包含数据库的控制器的问题更严重,因为您的模型具有更多的模块(更多的模型,更多的重分解)

更新:

对不起,我可能使用了一些松散的术语控制器和模型…也许这说明了紧耦合。我感到困惑的根源在于这个问题

对于一个模型,它不应该是:

$user = new User($id);
$data['name'] = $user->getName();
$data['title'] = $user->getTitle();
return $data
而不是:

$query = $this->db->get_where('user', array('id' => $id), 1, 0);
$row = $query->row_array(); 
$data['name'] = $row['name'];
$data['title'] = $row['title'];
return $data
假设#1:思考web的正确抽象 应用程序,包含 类库应该是 位于目录之外 包含演示文稿文件。 这个组织坚持干巴巴的原则 (“不要重复你自己”)校长 允许多次演示 文件夹(www.domain.com, management.domain.com、api.domain.com、, 使用相同的对象

这是正确的,因为库不用于表示(即不是视图)。它们是跨多个控制器使用的模块。通常,它们不应该使用持久数据,因为它们不是模型,但在某些情况下是模型(例如codeigniter会话)

假设2:

如果您的所有类都位于 在演示文稿文件夹之外, 然后是MVC中的模型 实现只需使用 那些课。如果那是真的,那么 MVC框架只是一个 演示类(控制器) 这有助于管理输入(获取& 发布请求),响应(模型) 或实例)和输出(视图或 模板)

这让我有点困惑。您是对的,控制器只是用于GET和POST请求的编排,但要注意调用“presentation类”。控制器负责模型(持久数据)和视图(数据表示)的编排

假设#3:

如果MVC框架只是一个 表示类,然后是数据库 类创建控制器实例 初始化打破了 控制器类。模型 控制器实例)不应具有 (“有”)数据库,它应该有 图书馆中的东西(用户、产品) 那东西应该有 数据库

这很令人困惑,我真的不明白你在说什么。MVC只是一个“表示类”,模型没有“数据库”,框架可以与数据库保持连接,模型是数据库的抽象(如用户、产品等对象)

假设4:

此外,如果MVC框架是 只是一堂演示课 控制器所属的数据库类 实例初始化太紧 与控制器类耦合。 从一种存储方式转变为 另一个需要重新考虑所有因素 模型

控制器不初始化数据库,框架通常只处理访问数据库抽象(模型)的控制器。如果数据库系统被任何东西替换,则只重新考虑模型接口的实现

假设#5:

通过HMVC框架,解决了以下问题: 包含数据库的控制器 更糟糕的是,因为你的模型更 模块(更多型号,更多 重新分解)

HMVC不一定意味着更多的型号。使用HMVC允许项目中的可移植模块可以跨多个控制器访问。通常,您会看到库在非HMVC框架(即不使用db/模板的库)中执行此操作

假设#1:思考web的正确抽象 应用程序,包含 类库应该是 位于目录之外 包含演示文稿文件。 本组织遵守《公约》
httpdocs
subdomains
+--management
   +--httpdocs
modules
system
httpdocs
+--application
+--index.php
subdomains
+--management
   +--httpdocs
      +--application
      +--index.php
$application = 'application';
$modules = '/root/pathto/modules';
$system = '/root/pathto/system';