Php MVC模型应该是静态的吗?
编辑:经过一些研究,我看到了以下框架:。它在Libs文件夹中有静态类(比如Config、Session),我可以使用这些类吗Php MVC模型应该是静态的吗?,php,model-view-controller,Php,Model View Controller,编辑:经过一些研究,我看到了以下框架:。它在Libs文件夹中有静态类(比如Config、Session),我可以使用这些类吗 我是MVC实践的新手,我被一个奇怪的问题困住了 我有很多模型,比如数据库、用户、配置等。。但是我在我创建的每个函数中都使用了很多 我在使用MVC模式时遇到问题;我创建了多个模型,我使用每个模型来处理分组任务(连接、数据库等) 问题是,在创建基本模型之后,我最终得到了这样的代码(在控制器中) 我必须为一个或两个函数创建许多模型的实例。。但如果模型是静态的,则应如下所示:
我是MVC实践的新手,我被一个奇怪的问题困住了 我有很多模型,比如数据库、用户、配置等。。但是我在我创建的每个函数中都使用了很多 我在使用MVC模式时遇到问题;我创建了多个模型,我使用每个模型来处理分组任务(连接、数据库等) 问题是,在创建基本模型之后,我最终得到了这样的代码(在控制器中) 我必须为一个或两个函数创建许多模型的实例。。但如果模型是静态的,则应如下所示:
class User
{
function signup($username, $password, ...)
{
$canRegister = Config::get("registration-enabled");
if ($canRegister and ..) {
$this->username = $username;
DB::saveAccount($this);
session::setUser($this);
} else {
throw new Exception('bad signup');
}
}
}
$config = new Conifg();
$config->load(__DIR__ . '/config_array.php');
$user = new User($config);
$system = new System($config);
// and so on, you got the point
请注意,许多模型不使用_构造方法。。那么,在MVC模式中使用静态模型是一种好的做法(还是不错的做法)
回复前请参见上面的编辑。模型是一个抽象概念!
模型由服务组成,而服务本身由存储抽象和处理计算的对象组成。简言之,服务是域对象和存储抽象(如数据映射器或表网关)之间的桥梁。模型由这些服务组成
这是构建模型的典型方式:
Model
- Storage
- MySQL
- YourMapper
- Service
- YourService
处理表的抽象并进行计算和验证的类也是已知的(这似乎是您的情况),因为它违反了SRP并打破了关注点的分离
如果坚持这种正确的方式,您可以轻松地替换存储(比如说,您可以将MySQL替换为MongoDB),因为它们不再与业务逻辑紧密耦合。或者,您可以替换处理计算的域对象,而无需接触存储
不,任何东西都不应该是静态的!
举个例子,让我们想象一下,您编写了一个库来进行文件上传
class Uploader
{
...
public function upload(array $files)
{
$path = Config::read('upload_path');
$some_another_option = Config::read('foo');
$this->move($path, $some_another_option, $files);
}
...
}
那么这里可能存在什么样的问题呢?请记住,我们编写了一个库,让我们面对这些事实:
- 为了使用上载库,必须正确实例化Config对象,并且必须将其数据完全加载到内存中。这是对内存和内存的浪费
- 如果您决定将
替换为另一个所需信息源,该怎么办?你不能,因为它是Config
- 如果要分发库,还必须分发配置及其依赖项,这会使库看起来很糟糕
Conifg
时,您可能从某个地方加载数据(数组或表,等等)。因此,在第一种方法中,您必须加载它n次
?这似乎是一种非常错误的做法
您真正应该做的是只实例化Config一次,并将其传递给需要它的类,如下所示:
class User
{
function signup($username, $password, ...)
{
$canRegister = Config::get("registration-enabled");
if ($canRegister and ..) {
$this->username = $username;
DB::saveAccount($this);
session::setUser($this);
} else {
throw new Exception('bad signup');
}
}
}
$config = new Conifg();
$config->load(__DIR__ . '/config_array.php');
$user = new User($config);
$system = new System($config);
// and so on, you got the point
这同样适用于您的DB
和会话。使用这些对象的类不应该为它们的实例化而烦恼。他们只是想知道如何使用它们
记住:没有什么比静态类和单例更能破坏代码重用能力的了
所有酷家伙都把这种技术称为模型是一种抽象概念!
模型由服务组成,而服务本身由存储抽象和处理计算的对象组成。简言之,服务是域对象和存储抽象(如数据映射器或表网关)之间的桥梁。模型由这些服务组成
这是构建模型的典型方式:
Model
- Storage
- MySQL
- YourMapper
- Service
- YourService
处理表的抽象并进行计算和验证的类也是已知的(这似乎是您的情况),因为它违反了SRP并打破了关注点的分离
如果坚持这种正确的方式,您可以轻松地替换存储(比如说,您可以将MySQL替换为MongoDB),因为它们不再与业务逻辑紧密耦合。或者,您可以替换处理计算的域对象,而无需接触存储
不,任何东西都不应该是静态的!
举个例子,让我们想象一下,您编写了一个库来进行文件上传
class Uploader
{
...
public function upload(array $files)
{
$path = Config::read('upload_path');
$some_another_option = Config::read('foo');
$this->move($path, $some_another_option, $files);
}
...
}
那么这里可能存在什么样的问题呢?请记住,我们编写了一个库,让我们面对这些事实:
- 为了使用上载库,必须正确实例化Config对象,并且必须将其数据完全加载到内存中。这是对内存和内存的浪费
- 如果您决定将
Config
替换为另一个所需信息源,该怎么办?你不能,因为它是
- 如果要分发库,还必须分发配置及其依赖项,这会使库看起来很糟糕
是的,您可能在另一个框架中见过这种方法。但无论如何,流行并不意味着正确
正确的方式,,
您必须记住,对象实例化也是另一项职责。当您实例化一个Conifg
时,您可能从某个地方加载数据(数组或表,等等)。因此,在第一种方法中,您必须加载它n次
?这似乎是一种非常错误的做法
您真正应该做的是只实例化Config一次,并将其传递给需要它的类,如下所示:
class User
{
function signup($username, $password, ...)
{
$canRegister = Config::get("registration-enabled");
if ($canRegister and ..) {
$this->username = $username;
DB::saveAccount($this);
session::setUser($this);
} else {
throw new Exception('bad signup');
}
}
}
$config = new Conifg();
$config->load(__DIR__ . '/config_array.php');
$user = new User($config);
$system = new System($config);
// and so on, you got the point
这同样适用于您的DB
和会话。使用这些对象的类不应该为它们的实例化而烦恼。他们只是想知道如何使用它们
记住:没有什么比静态类和单例更能破坏代码重用能力的了
所有帅哥都提到