Php MVC模型应该是静态的吗?

Php MVC模型应该是静态的吗?,php,model-view-controller,Php,Model View Controller,编辑:经过一些研究,我看到了以下框架:。它在Libs文件夹中有静态类(比如Config、Session),我可以使用这些类吗 我是MVC实践的新手,我被一个奇怪的问题困住了 我有很多模型,比如数据库、用户、配置等。。但是我在我创建的每个函数中都使用了很多 我在使用MVC模式时遇到问题;我创建了多个模型,我使用每个模型来处理分组任务(连接、数据库等) 问题是,在创建基本模型之后,我最终得到了这样的代码(在控制器中) 我必须为一个或两个函数创建许多模型的实例。。但如果模型是静态的,则应如下所示:

编辑:经过一些研究,我看到了以下框架:。它在Libs文件夹中有静态类(比如Config、Session),我可以使用这些类吗


我是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
会话。使用这些对象的类不应该为它们的实例化而烦恼。他们只是想知道如何使用它们

记住:没有什么比静态类和单例更能破坏代码重用能力的了

所有帅哥都提到