Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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
正在引用PHP中的现有对象。。。大概_Php_Oop_Model View Controller - Fatal编程技术网

正在引用PHP中的现有对象。。。大概

正在引用PHP中的现有对象。。。大概,php,oop,model-view-controller,Php,Oop,Model View Controller,有件事我不明白。我建立了一个相当酷的路由器和MCV系统的基础上的视频教程,它的作品伟大!有一件事我有点困惑。这并不是特定于代码,而是更多关于逻辑。简言之: 控制器是从URL获取的 路由器分派控制器类并实例化它 实例化的控制器类扩展了一个基 控制器,并将使用相应的模型类 该模型类是静态的,不会被实例化。假设我想创建一个新成员。在控制器类中,我会有如下内容: Model::createMember($this->first_name, $this->last_name, $this-&g

有件事我不明白。我建立了一个相当酷的路由器和MCV系统的基础上的视频教程,它的作品伟大!有一件事我有点困惑。这并不是特定于代码,而是更多关于逻辑。简言之:

  • 控制器是从URL获取的
  • 路由器分派控制器类并实例化它
  • 实例化的控制器类扩展了一个基 控制器,并将使用相应的模型类
  • 该模型类是静态的,不会被实例化。假设我想创建一个新成员。在控制器类中,我会有如下内容:

    Model::createMember($this->first_name, $this->last_name, $this->screen_name, $this->created_date);
    
    public function createMember($first_name, $last_name, $screen_name, $created_date) { blah blah blah }
    
    当然,在模型中,我会有一个方法,在基础数据库中创建成员,如下所示:

    Model::createMember($this->first_name, $this->last_name, $this->screen_name, $this->created_date);
    
    public function createMember($first_name, $last_name, $screen_name, $created_date) { blah blah blah }
    
    这一切都很好,但在我看来,我应该能够从模型中直接访问控制器对象的属性,并且不必传递所有这些参数。访问对象的属性对我来说更像是面向对象的,所以这就是我想要做的

    问题是,我做不到

    $controller_object = new Controller();
    
    从模型类中引用控制器并访问其属性

    路由器中已经存在控制器对象,因此创建一个新对象对我没有好处。我需要能够创建一个引用现有对象的变量

    现在我已经开始工作了,但是我基本上把控制器对象的属性设置为全局的,然后可以用global关键字直接从模型类访问它们,但是我真的不想这样做


    那么,我关于改进系统的想法是不是很糟糕,或者有没有一种方法可以引用现有的控制器对象,这样我就可以直接访问它的公共属性,而无需将参数从控制器传递到模型?

    您的问题的直接答案是使用
    $this
    ,当您在控制器方法中时,它实际上表示实例化的控制器,因此

    Model::createMember($this->first_name, $this->last_name, $this->screen_name, $this->created_date);
    
    你可以这么做

    Model::createMember($this);
    
    然后在模型内部,您可以访问控制器对象

    实际上,我不会这样做,因为模型实际上不应该依赖于控制器

    控制器的职责是解析传入的请求数据,创建模型并将请求数据传递到模型中

    实际上,控制器中不需要有
    名字
    姓氏
    等属性。控制器可以有一些带有传入数据的
    $data
    数组,它不应该关心此数据的实际内容

    模型的职责是验证数据(这也可以是一个单独的对象),并执行数据库操作,或与数据相关的任何其他业务逻辑操作

    我也会避免对模型使用静态方法。而不是

    Model::createMember(...parameters...)
    
    我愿意

    // $data is the request data parsed by controller
    // controller knows how / where to get the data (from GET, POST, etc)
    // but it doesn't care about the actual content
    $model = Model($data)
    ... 
    if ($model->validate()) {
        $model->save()
        // show success message to the user
    } else {
        // show error message to the user
    }
    

    模型只是一个模型,它不应该了解控制器或应用程序逻辑。若您这样做了,那个么MVC分离就消失了,您的模型将与控制器耦合并依赖于控制器。控制器应该获取输入并用它填充模型。为什么要从模型访问控制器的属性?嗯,模型是特定于控制器的。如果我有一个MemberController,那么我也会有一个MemberModel。所以,它们是相关的。MemberModel基本上是特定于MemberController的CRUD功能,它不仅仅是一个通用模型,而且是特定于将使用它的控制器。我想我考虑直接从控制器对象访问它们的唯一原因是因为它更面向对象,而不是像过程函数那样传递参数。然而,事实是,除了我认为这将是更高效和更干净的代码之外,没有其他真正的原因。我明白你的意思。也许我的系统给控制器增加了一点重量。我同意所有数据库功能都是在模型中完成的。但是,控件需要知道它传递给模型的是什么数据,以防在传递给它之前或响应视图时需要操作任何数据。在我的情况下,我不做任何服务器端表单验证。所有这些都是在客户端完成的。该模型当然会检查现有的电子邮件地址和匹配的凭据,但不会进行表单验证。哦,但无论如何,我确实根据注释对某些内容进行了更改,并删除了所有全局变量。